Użycie myślnika (-) zamiast nazwy pliku

W przypadku polecenia, jeśli jako argumentu używasz - zamiast nazwy pliku będzie oznaczać STDIN lub STDOUT.

  1. Ale w tym przykładzie tworzy plik o nazwie -:

    echo hello > - 

    Jak ustawić - w tym przykładzie jako STDOUT?

  2. I na odwrót, jak mogę sprawić, by - oznaczało plik o nazwie - w przykładach takich jak:

    cat - 

Komentarze

  • Ponieważ najwyraźniej muszę mieć 50 punktów reputacji, aby móc komentować bezpośrednio. W komentarzu / dev / stdin / dev / stdout, AIX, który jest legalną pochodną systemu UNIX, nie ma tych pseudourządzeń. I jako kolejny komentarz, LINUX w żadnym wypadku nie jest pochodną systemu UNIX. Jest to praca podobna do POSIX i najpopularniejsza w tej chwili z ' UNIX-owego systemu operacyjnego, ale nie popełnij błędu, nie jest to UNIX. Ale istota odpowiedzi tutaj jest poprawna. Notacja " – " nie jest interpretowana przez powłokę jako specjalna i dlatego jest przekazywana bezpośrednio do każdej aplikacji jako ARG. Jeśli aplikacja nie rozpoznaje
  • Istnieje również konstrukcja 2>&-, co oznacza " zamknięty deskryptor 2 ".
  • @ user95873, przypuszczam, że chciałbyś powiedzieć: podczas gdy Linux jest podobny do Uniksa, nie każdy Uniksopodobny (lub prawdziwy UNIX) jest Linux . To, czy Linux jest, czy nie ' t prawdziwy UNIX (tj. Jest zgodny ze specyfikacją Single UNIX), nie ' nie ma związku z / dev / problem {in, out, err}. Ponieważ / dev / std {in, out, err} jest dodana funkcja, a nie brakująca .

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ź

  1. 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.

  1. 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 | 
  2. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *