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/stdin
i/dev/stdout
są 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/stdout
i/dev/stderr
są 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 ".