Что указывает амперсанд в этой команде bash 1> & 2 - PullRequest
35 голосов
/ 26 февраля 2010

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

Ответы [ 6 ]

61 голосов
/ 26 февраля 2010

2>&1 перенаправляет стандартную ошибку (дескриптор файла 2) в тот же файл, в который стандартный вывод (дескриптор файла 1) в данный момент собирается

Это также зависит от позиции, поэтому:

prog >x 2>&1 >y

фактически отправит стандартную ошибку на x и стандартный вывод на y следующим образом:

  • Подключите стандартный выход к x;
  • Затем соединяет стандартную ошибку с тем же текущим стандартным выходом, который равен x;
  • Затем подключите стандартный выход к y;
18 голосов
/ 26 февраля 2010

Копирует файловый дескриптор 1 в файловый дескриптор 2. FD2 - это stderr, а FD1 - это stdout, поэтому любой вывод в stderr вместо этого идет в stdout.

17 голосов
/ 26 февраля 2010

Амперсанд принадлежит «1», поэтому фрагмент действительно состоит из трех частей: «2», «>», «& 1». Они означают, соответственно, «взять данные из выходного потока 2 (что является стандартной ошибкой)», «перенаправить их» и цель перенаправления, которая является выходным потоком 1. Так что «&» здесь позволяет вам перенаправить в существующий поток , а не в файл.

15 голосов
/ 05 июля 2016

& в &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
7 голосов
/ 26 февраля 2010

С 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.

0 голосов
/ 26 февраля 2010

амперсанд ничего не делает - это символ в операторе 2>&1, а не вещь сама по себе.

bash поддерживает несколько операторов перенаправления , оператор 2>&1 или &> связывают потоки процесса до или после перенаправления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...