W przypadku polecenia, jeśli jako argumentu używasz - zamiast nazwy pliku będzie oznaczać STDIN lub STDOUT.
-
Ale w tym przykładzie tworzy plik o nazwie
-:echo hello > -Jak ustawić
-w tym przykładzie jako STDOUT? -
I na odwrót, jak mogę sprawić, by
-oznaczało plik o nazwie-w przykładach takich jak:cat -
Komentarze
Odpowiedź
Używanie - jako nazwy pliku w celu oznaczenia stdin / stdout jest konwencją używaną przez wiele programów. Nie jest to specjalna właściwość nazwy pliku. Jądro nie rozpoznaje - jako specjalnego, więc wszelkie wywołania systemowe odwołujące się do - jako nazwy pliku będą używać - dosłownie jako nazwa pliku.
W przypadku przekierowania bash, - nie jest rozpoznawane jako specjalna nazwa pliku, więc bash użyje jej jako dosłownej nazwy pliku.
Kiedy cat widzi ciąg - jako nazwę pliku, traktuje go jako synonim stdin. Aby obejść ten problem, musisz zmienić ciąg, który cat widzi w taki sposób, aby nadal odnosił się do pliku o nazwie -. Zwykle można to zrobić poprzedzając nazwę pliku ścieżką – ./- lub /home/Tim/-. Technika ta jest również używana do obejścia podobnych problemów, w których opcje wiersza poleceń kolidują z nazwami plików, więc plik określany jako ./-e nie pojawia się jako -e opcja wiersza poleceń do programu, na przykład.
Komentarze
- It ' s warto dodać, że
/dev/stdini/dev/stdoutsą powszechnie dostępne i można ich używać zamiast-konwencja. - @jmtd: / dev / std {in, out} nie są powszechnie dostępne. Nie wszystkie unixy to mają.
- Interesujące, założyłem, że są częścią POSIX (ale nie mogą ' t potwierdzić). ' są obecne przynajmniej w Linuksie, BSD i Solaris. Czy możesz podać przykład nowoczesnego systemu UNIX, który ich nie ma?
- @camh Nie jestem pewien, czy otrzymałeś powiadomienie, a jest to bardzo, bardzo stary temat; ' Nie jestem pewien, czy możesz, ale ' Jestem bardzo ciekawy, czy znasz odpowiedź na
jmtd' pytanie? 🙂 - @jmtd Wydaje mi się, że znalazłem wstępną odpowiedź na pytanie: unix.stackexchange.com/a/278368/31669
Odpowiedź
-
Zamiast
echo hello > -, możesz użyćecho hello > /dev/stdout.Chociaż „-” jest konwencją, którą musi zaimplementować każdy program, który chce ją obsługiwać,
/dev/stdin,/dev/stdouti/dev/stderrsą obsługiwane przez system operacyjny (przynajmniej Solaris, Linux i BSD) , niezależnie od aplikacji, a następnie będzie działać tak, jak zamierzasz.
Odpowiedź
Jak wspomniane camh , - to po prostu konwencja nazewnictwa używana przez niektóre programy.Jeśli chcesz odwołać się do tych strumieni za pomocą deskryptora pliku, który rozpozna powłoka, jiliagre miała rację , używając nazwy /dev/stdin lub /dev/stdout. Te nazwy plików powinny działać w każdym miejscu, w którym działałaby normalna nazwa pliku.
-
To powiedziawszy, twój pierwszy przykład jest trochę głupi. Każde wyjście, które zostałoby przechwycone przez operatora przekierowania w celu zapisu do pliku, jest już na standardowym wyjściu, więc przekierowanie go i zapisanie z powrotem tam, skąd pochodzi, jest bezużyteczne. Zachowanie, którego tam używasz, to potok, a nie przekierowanie:
echo hello | -
W drugim przykładzie wystarczy podać wskazanie, że chcesz plik litterowy o tej nazwie, a nie wewnętrzny alias, który ma. Najłatwiej to zrobić, określając ścieżkę do pliku w następujący sposób:
cat ./-
Odpowiedź
Jeśli chodzi o punkt 1, program musi go obsługiwać. Nie możesz jej użyć arbitralnie. Jeśli chodzi o 2, przekieruj dane wejściowe z (np. cat < -).
Odpowiedź
Podejście „-” wiąże się z wieloma problemami. Przede wszystkim wymaga interpretacji znaku „-„, a wiele programów nie wykonuje takiej interpretacji. Ponadto istnieje kilka programów, które interpretują myślnik jako separator oznaczający koniec opcji wiersza poleceń. Programy są napisane tak, aby działały z argumentami nazw plików, podejście „-” to sztuczka, fajna, ale słaba.
Najlepszy sposób to:
$ echo hello > /dev/fd/1
/dev/stdout to symboliczne łącze /dev/fd/1
Komentarze
- Przekierowanie jest interpretowane przez powłokę, a nie wywoływany program.
Odpowiedź
Znaki specjalne mają przeważnie dwa znaczenia:
Wykres numeryczny ASCII.
Skrypty lub symboliczne.
Jest możliwe, że pojedynczy znak reprezentuje ciąg lub działa jako ciąg. Zgodnie z moim rozumieniem.
w języku C fopen() pobiera dwa argumenty, pierwszy strumień pliku i drugi tryb, w którym plik zostanie otwarty. Tryb jest ciągiem znaków. nawet jeśli jest to pojedynczy znak.
cat > " – " działa.
2>&-, co oznacza " zamknięty deskryptor 2 ".