Быстрый, 2>&1
перенаправляет stderr на stdout, но что означает амперсанд? Я знаю, если бы у нас был 2 > 1
, он выводил бы в файл с именем 1
, что делает амперсанд?
Что указывает амперсанд в этой команде bash 1> & 2
Ответ 1
Он копирует дескриптор файла 1 в дескриптор файла 2. FD2 - это stderr, а FD1 - stdout, поэтому он делает любой вывод для stderr вместо stdout.
Ответ 2
2>&1
перенаправляет стандартную ошибку (дескриптор файла 2) в тот же файл, что и стандартный вывод (дескриптор файла 1) в настоящее время.
Это также зависящая от позиции вещь, поэтому:
prog >x 2>&1 >y
действительно отправит стандартную ошибку на x
и стандартный вывод на y
следующим образом:
- Подключите стандартный вывод к
x
; - Затем подключите стандартную ошибку к такому же, как и к текущему стандартным выводам, который равен
x
; - Затем подключите стандартный вывод к
y
;
Ответ 3
Амперсанд относится к "1", поэтому фрагмент действительно состоит из трех частей: "2", " > ", "& 1". Они означают, соответственно, "принимать данные из выходного потока 2 (который является стандартной ошибкой)", "перенаправлять его" и цель перенаправления, которая является выходным потоком 1. Итак, "&" здесь вы можете перенаправить существующий поток, а не в файл.
Ответ 4
&
в &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
Ответ 5
От info bash
:
3.6.7 Duplicating File Descriptors
----------------------------------
The redirection operator
[N]<&WORD
is used to duplicate input file descriptors. If WORD expands to one
or more digits, the file descriptor denoted by N is made to be a copy
of that file descriptor. If the digits in WORD do not specify a file
descriptor open for input, a redirection error occurs. If WORD
evaluates to `-', file descriptor N is closed. If N is not specified,
the standard input (file descriptor 0) is used.
The operator
[N]>&WORD
is used similarly to duplicate output file descriptors. If N is not
specified, the standard output (file descriptor 1) is used. If the
digits in WORD do not specify a file descriptor open for output, a
redirection error occurs. As a special case, if N is omitted, and WORD
does not expand to one or more digits, the standard output and standard
error are redirected as described previously.
Итак, 2>&1
дублирует fd 1 на fd 2.
Ответ 6
Амперсанд ничего не делает - это символ в операторе 2>&1
, а не как вещь сама по себе.
bash поддерживает несколько операторов перенаправления оператор 2>&1
или оператор &>
связывают потоки процесса до или после перенаправления.