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
Это, я не мог понять. Двоеточие - это встроенная команда, которая ничего не делает, кроме расширения параметров и перенаправления. Он создает пустой файл ...? Возможно, чтобы указать другой программе, что выбор сделан ...? Или сохранить отметку времени ...? Без понятия.
Спасибо!Я не понимаю, на данный момент >> FD # 2 ('stderr') перенаправляется на FD # 1 (' stdout', который присваивается 'INTERFACE' из-за обратных ссылок). FD # 1 ('stdout') перенаправляется на FD # 3. .... Часть INTERFACE = '....' в порядке, но, насколько я понимаю, 'stdout' блока backticks уже перенаправлен на FD # 3, поэтому не может понять, как мы можем захватить' stdout' а он уже перенаправлен? –
@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
Получил! Да .... Я думаю, что ключевой частью является раздел «в этой точке» .... Спасибо –