Я видел эту строку в скрипте:
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
и &
для чего?
Ответы:
Числа являются файловыми дескрипторами, и только первые три (начиная с нуля) имеют стандартизированное значение:
Таким образом, каждое из этих чисел в вашей команде относится к дескриптору файла. Вы можете перенаправить файловый дескриптор в файл с помощью
>
или перенаправить его на другой файловый дескриптор с помощью>&
В
3>&1
вашей командной строке создаст новый файловый дескриптор и перенаправит его на1
которыйSTDOUT
. Теперь1>&2
перенаправит файловый дескриптор 1 вSTDERR
и2>&3
перенаправит файловый дескриптор 2 в 3, который естьSTDOUT
.Итак, в основном вы перешли,
STDOUT
иSTDERR
эти шаги:Теперь, если программа что-то печатает в файловом дескрипторе 1, она будет напечатана в файловом дескрипторе 2, и наоборот.
источник
Это обмен
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
. Глядя на его справочную страницу , я вижутак что, возможно, человек, который написал сценарий, хочет, чтобы
dialog
вывод по какой-то причине пошел поstdout
какой-stderr
то причине.Смотрите также Порядок перенаправлений
источник
Автор сценария определил fd 3, например:
Откройте «File.txt» и назначьте ему fd 3. Максимальное количество файловых дескрипторов: 255
Читайте только 4 символа.
Запишите десятичную точку там.
Закрыть FD 3.
==> 1234.67890
источник