Что «3> & 1 1> & 2 2> & 3» делает в сценарии?

69

Я видел эту строку в скрипте:

DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`

Что такое

3>&1 1>&2 2>&3

делать? Я знаю, что 1 = stdout и 2 = stderr, но для чего 3и &для чего?

jsterr
источник

Ответы:

77

Числа являются файловыми дескрипторами, и только первые три (начиная с нуля) имеют стандартизированное значение:

0 - stdin
1 - stdout
2 - stderr

Таким образом, каждое из этих чисел в вашей команде относится к дескриптору файла. Вы можете перенаправить файловый дескриптор в файл с помощью >или перенаправить его на другой файловый дескриптор с помощью>&

В 3>&1вашей командной строке создаст новый файловый дескриптор и перенаправит его на 1который STDOUT. Теперь 1>&2перенаправит файловый дескриптор 1 в STDERRи 2>&3перенаправит файловый дескриптор 2 в 3, который есть STDOUT.

Итак, в основном вы перешли, STDOUTи STDERRэти шаги:

  1. Создайте новый FD 3 и укажите его на FD 1
  2. Перенаправить файловый дескриптор 1 на файловый дескриптор 2. Если бы мы не сохранили файловый дескриптор в 3, мы потеряли бы цель.
  3. Перенаправьте дескриптор файла 2 на дескриптор файла 3. Теперь дескрипторы файлов один и два переключаются.

Теперь, если программа что-то печатает в файловом дескрипторе 1, она будет напечатана в файловом дескрипторе 2, и наоборот.

Ульрих Дангел
источник
Вы сказали: «3> & 1 в вашей командной строке создаст новый файловый дескриптор и перенаправит его на 1, который является STDOUT». Но разве 1 ​​не означает STDIN?
sofs1
19

Это обмен stdoutи stderr.

>nameозначает перенаправить вывод в файл name.

>&numberозначает перенаправить вывод в дескриптор файла number.

Таким образом, &необходимо указать оболочке, что вы имеете в виду дескриптор файла, а не имя файла.

Файловый дескриптор - это число, которое относится к уже открытому файлу. Стандартные предназначены 0для стандартного ввода, 1для стандартного вывода или 2для стандартной ошибки. Вы также можете использовать любой другой номер, который создаст новый файловый дескриптор, так же как и при создании новой переменной с помощью var=value.

По умолчанию и дескриптор файла, 1и 2переход к нему /dev/tty, поэтому, если вы запустите somecommand 3>&1 1>&2 2>&3новую оболочку, она ничего не изменит (за исключением того, что теперь у вас есть дескриптор файла номер 3).

Но если где-то ранее в скрипте он выполняет перенаправление с использованием exec (например exec 2>error.log), или сценарий запускается с командной строкой, включающей перенаправление (например ./thescript 2>error.log), тогда замена stdout и stderr сделает что-то.

В вашем конкретном случае команда, у которой поменялись местами stdout и stderr dialog. Глядя на его справочную страницу , я вижу

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

так что, возможно, человек, который написал сценарий, хочет, чтобы dialogвывод по какой-то причине пошел по stdoutкакой- stderrто причине.

Смотрите также Порядок перенаправлений

Mikel
источник
1

Автор сценария определил fd 3, например:

exec 3<> File.txt

Откройте «File.txt» и назначьте ему fd 3. Максимальное количество файловых дескрипторов: 255

read -n 4 <&3

Читайте только 4 символа.

echo -n . >&3

Запишите десятичную точку там.

exec 3>&-

Закрыть FD 3.

cat File.txt

==> 1234.67890

Джонатан Джексон
источник
1
tldp.org/LDP/abs/html/io-redirection.html
Джонатан Джексон