(Prawie) wszystko jest plikiem, ale nie wszystko jest zwykłym plikiem. Nie ma sensu wywoływać edytora tekstu na czymś, co jest plikiem specjalnym, takim jak katalog, gniazdo sieciowe, port szeregowy itp.
Plik /dev/stdout
może być jedną z kilku rzeczy w zależności od wariantu unix:
- plik „specjalny”, zwykle urządzenie znakowe;
- „magiczny” symboliczny link, który wskazuje na plik, który proces uzyskujący dostęp do niego otworzył na tym deskryptorze;
- symboliczny link do jednego z powyższych.
W każdym razie otwieranie /dev/stdout
i podobne pliki tworzą nowy deskryptor pliku powiązany z tym samym plikiem, który aplikacja już otworzyła na deskryptorze pliku 1. „Standardowe wyjście” oznacza deskryptor pliku 1 i jest to tylko konwencja, że ten deskryptor pliku jest używany dla danych wyjściowych - jądro nie ma znaczenia.
Po uruchomieniu programu w terminalu wszystkie trzy standardowe deskryptory (0 = standardowe wejście, 1 = standardowe wyjście, 2 = standardowy błąd) są otwierane na urządzeniu końcowym. Odczytywanie z tego urządzenia zwraca znaki wpisane przez użytkownika, a pisanie na tym urządzeniu wyświetla tekst w oknie terminala. (Nie ma standardowego sposobu, biorąc pod uwagę urządzenie końcowe, odczytania wyświetlanego wyjścia lub wstrzyknięcia do niego danych wejściowych).
Po uruchomieniu cat /dev/stdout
działa dokładnie tak samo jak cat /dev/stdin
lub cat /dev/stderr
, ponieważ te trzy deskryptory plików są podłączone do tego samego pliku: nakazuje cat
odczyt z terminala. Właśnie tocat
bez argumentu.
Jeśli uruchomiłeś cat /dev/stdout >foo
, to /dev/stdout
odniósłby się do pliku foo
- to polecenie jest równoważne z cat foo >foo
. W zależności od cat
implementacji może to albo spowodować błąd (wersja GNU narzeka, że „plik wejściowy to plik wyjściowy”), albo może nic nie robić, ponieważ czyta z pliku, foo
który jest pusty ( >foo
po prostu go obciął). W wersji cat
, która nie wykrywa tego specjalnego przypadku, jeśli foo
nie jest pusty, wówczas cat /dev/stdout >>foo
lub odpowiednik cat foo >>foo
dołączałby zawartość pliku do siebie na czas nieokreślony.
Po uruchomieniu vim /dev/stdout
narzeka, ponieważ nie wie, jak edytować terminal (to po prostu nie ma sensu).