(Майже) все - це файл, але не все - звичайний файл. Немає сенсу викликати текстовий редактор на щось, що є спеціальним файлом, таким як каталог, мережевий сокет, послідовний порт тощо.
Файл /dev/stdout
може бути одним із кількох речей залежно від варіанту unix:
- "спеціальний" файл, як правило, символьний пристрій;
- символічне посилання "магія", яке вказує на файл, який відкриває процес, що має доступ до цього дескриптора;
- символічне посилання на одне із зазначених вище.
У будь-якому випадку, відкриваючи /dev/stdout
та подібні файли, створюється новий дескриптор файлів, пов'язаний з тим самим файлом, який програма вже відкрила в дескрипторі файлів 1. "Стандартний вихід" означає дескриптор файлу 1, і це лише умова використання цього дескриптора файлів для виводу - ядро не хвилює.
Коли ви запускаєте програму в терміналі, всі три стандартні дескриптори (0 = стандартний вхід, 1 = стандартний вихід, 2 = стандартна помилка) відкриваються на термінальному пристрої. Читання з цього пристрою повертає символи, введені користувачем, а запис на цей пристрій відображає текст у вікні терміналу. (Немає стандартного способу для даного термінального пристрою зчитувати вихід, який він відображає, або вводити в нього вхід.)
Коли ви запускаєте cat /dev/stdout
, це робить те саме, що cat /dev/stdin
або cat /dev/stderr
, тому що ці три дескриптори файлів підключені до одного файлу: він повідомляє cat
читати з терміналу. Ось що cat
і без аргументів.
Якщо ви бігли cat /dev/stdout >foo
, то /dev/stdout
посилалися б на файл foo
- ця команда еквівалентна cat foo >foo
. Залежно від cat
реалізації, вона може або помилитися (версія GNU скаржиться на те, що "вхідний файл є вихідним файлом"), або може нічого не робити, тому що читає з foo
порожнього файлу ( >foo
просто усічений). З версією cat
, яка не виявляє цей особливий випадок, якщо foo
він не порожній, тоді cat /dev/stdout >>foo
або еквівалент cat foo >>foo
додає вміст файлу до себе на невизначений час.
Під час запуску vim /dev/stdout
він скаржиться, оскільки не знає, як редагувати термінал (це просто не має сенсу).