Що робить "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і &для?


Відповіді:


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якоїсь причини.

Дивіться також Порядок переадресацій


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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.