2015-07-24 2 views
1

Я не могу интерпретировать код удараShell Перенаправление - Диалог

exec 3>&1 
INTERFACE=`echo $DIALOG_TAGS | xargs dialog --title 'Test' --menu ' Text comes here :' 0 0 0 2>&1 1>&3` 
exec 3>&- 
: > $TMPDIR/._tmp.conf 

Мой вопрос; FD # 3 создается с exec 3>&1 и перенаправляется туда, куда идет FD # 1. Во второй строке мы имеем 2>&1 1>&3, что меня смущает.

Другая часть - последняя строка, где : и перенаправление >.

Любые объяснения будут высоко оценены! Благодаря

ответ

2
exec 3>&1 

FD # 3 создается, запись FD # 1 (stdout).

INTERFACE=`echo $DIALOG_TAGS | xargs dialog --title 'Test' --menu ' Text comes here :' 0 0 0 2>&1 1>&3` 

Выполняется команда в backtics. (В этом случае меню dialog отображение пары тегов/записи, определенной в DIALOG_TAGS.)

ФД # 2 (stderr) перенаправляются на FD # 1 (stdout, который назначаемые для INTERFACE из-за кавычку). FD # 1 (stdout) перенаправляется на FD # 3.

Идея заключается в следующем:

  • dialog отображает меню, из которого можно выбрать элемент. Меню, очевидно, нуждается в stdout, чтобы написать. Результат (выбор) из меню, по умолчанию, записан в stderr.
  • Автор хочет захвата в результате, таким образом, он перенаправляет stderr к &1 так что результат заканчивается в INTERFACE.
  • Однако он хочет только результата, а не все меню ... так вместо захвата меню и результата, он перенаправляет меню (stdout) к ранее созданной копии из stdout , оставив только результат, который будет отправлен на FD # 1, и таким образом сохранен в INTERFACE, тогда как меню отображается через FD # 3 (который все еще указывает на терминал, независимо от обратных выходов).

Как только это будет сделано ...

exec 3>&- 

FD # 3 закрыт, так как он больше не нужен.


: > $TMPDIR/._tmp.conf 

Это, я не мог понять. Двоеточие - это встроенная команда, которая ничего не делает, кроме расширения параметров и перенаправления. Он создает пустой файл ...? Возможно, чтобы указать другой программе, что выбор сделан ...? Или сохранить отметку времени ...? Без понятия.

+0

Спасибо!Я не понимаю, на данный момент >> FD # 2 ('stderr') перенаправляется на FD # 1 (' stdout', который присваивается 'INTERFACE' из-за обратных ссылок). FD # 1 ('stdout') перенаправляется на FD # 3. .... Часть INTERFACE = '....' в порядке, но, насколько я понимаю, 'stdout' блока backticks уже перенаправлен на FD # 3, поэтому не может понять, как мы можем захватить' stdout' а он уже перенаправлен? –

+0

@FehmiNoyanISI: Ха-ха, получил ча. :-) Переадресация оболочки удивительно неинтуитивно понятна. '2> & 1' перенаправляет FD # 2 туда, где FD # 1 указывает * в этот момент *. Это не означает, что FD # 2 теперь * включен * в FD # 1, он просто * перенаправлен * на его * цель *. И если строка продолжается с '1> & 3', это означает, что FD # 1 теперь перенаправляется туда, где FD # 3 указывает * в этот момент * (т. Е.' Stdout'), в то время как FD # 2 * указывающий, где FD # 1 указывал * в точке FD # 2, был перенаправлен *. --- Это требует времени. ;-) – DevSolar

+0

Получил! Да .... Я думаю, что ключевой частью является раздел «в этой точке» .... Спасибо –

Смежные вопросы