Подтвердить что ты не робот

Что указывает амперсанд в этой команде bash 1> & 2

Быстрый, 2>&1 перенаправляет stderr на stdout, но что означает амперсанд? Я знаю, если бы у нас был 2 > 1, он выводил бы в файл с именем 1, что делает амперсанд?

4b9b3361

Ответ 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.