&
в &1
дублирует дескриптор файла 1
. Дублированный дескриптор на самом деле ведет себя не как копия, а как псевдоним старого. Дублирование 1
позволяет перенаправить несколько потоков на 1
без перезаписи друг друга.
Пример: (нет &
)
$ ls existing-file non-existent-file > tmp 2> tmp
$ cat tmp
existing-file
nt-file: No such file or directory
Обратите внимание, что 1
переписал то, что написал 2
. Но не тогда, когда мы используем &
:
$ ls existing-file non-existent-file > tmp 2>&1
$ cat tmp
ls: non-existent-file: No such file or directory
existing-file
Файловый дескриптор является дескриптором файла (или другого ресурса ввода / вывода, такого как канал или сетевой сокет). Когда 1
и 2
отдельно перенаправляются на tmp
(как в первом примере), они независимо перемещают свой указатель файла tmp
. Вот почему файловые дескрипторы перезаписывают друг друга.
Согласно справочной странице Linux :
[Дубликаты файловых дескрипторов] ссылаются на то же описание открытого файла
и, таким образом, совместно использовать смещение файла и флаги состояния файла; например, если
смещение файла изменяется с помощью lseek (2) на одном из дескрипторов,
смещение также изменяется для другого.
Обратите внимание, что хотя &
действует как псевдоним, 2>&1
означает перенаправление 2
в поток, на который 1
в в настоящее время указывает. Когда 1
перенаправлен на что-то другое, 2
указывает на тот же файл, который он сделал независимо от 1
.
Обратите внимание:
$ ls existing-file non-existent-file > tmp 2>&1 > tmp1
$ cat tmp1
existing-file
$ cat tmp
ls: non-existent-file: No such file or directory