Разница в том, что вы пишете в два различных и (с точки зрения Perl и вашей программы) независимых дескриптора файла.
Первый - это дескриптор файла, открытый для специального файла «устройства» в ОС Unixy, который является «синонимом управляющего терминала процесса», , если есть »(цитата из этот документ Linux ). Обратите внимание, что хотя его обычно называют «экраном», это не обязательно (например, этот терминал может быть связан с файлом устройства последовательного порта); и он может не существовать или быть недоступным для открытия.
Второй файл - это обработанный файл, связанный по умолчанию с дескриптором файла # 1 для процесса.
Они могут казаться идентичными на первый взгляд из-за того факта, что в типичной ситуации оболочка Unix по умолчанию ассоциирует свой файловый дескриптор # 1 (и, таким образом, один из каждого запускаемого процесса без перенаправлений) с /dev/tty
.
Эти два понятия не имеют ничего общего с точки зрения Perl , ДРУГОЕ, чем тот факт, что эти два обычно связаны по умолчанию из-за работы оболочек Unix.
Функциональное поведение двух цитируемых фрагментов кода часто выглядит идентично из-за этого значения по умолчанию, но это просто "случайно".
Среди практических отличий:
/dev/tty
не обязательно существует в не-Unixy ОС. Поэтому использовать tty крайне непереносимо. Эквивалент Windows - CON:
IIRC.
STDOUT
программы может быть привязано (перенаправлено) к НИЧЕМ любому, кто вызвал программу. Может быть связан с файлом, может быть каналом к STDIN другого процесса.
Вы можете проверить, подключен ли ваш STDOUT к tty, используя оператор -t
:
if ( -t STDOUT ) { say 'STDOUT is connected to a tty' }
Обратите внимание, что вы МОЖЕТЕ убедиться, что ваш STDOUT записывает в /dev/tty
, явно закрыв файловый дескриптор STDOUT и снова открыв его, чтобы указать /dev/tty
:
close STDOUT or die $!;
open STDOUT '>:encoding(utf8)', '/dev/tty' or die $!;