2015-09-24 4 views
2

Обычно в системах Unix вы можете подавлять вывод команды, перенаправляя STDIN и/или STDERR в файл или/dev/null. Но что, если вам нужно передать содержимое в командную строку через STDIN в сценарии bash?Как безопасно отключить вывод команды?

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

Моей «проблемой» является то, что я написал функцию для выполнения команд с правильной обработкой ошибок и в которых я хотел бы перенаправить весь вывод, созданный выполненными командами в файл журнала.

Пример проблемы:

[18:25:35] [V] [email protected]:~# echo 'test' |read -p 'Test Output' TMP &>/dev/null 
[18:25:36] [V] [email protected]:~# echo $TMP 

[18:25:36] [V] [email protected]:~# 

Любые идеи о том, как решить мою проблему?

+3

'shopt -s lastpipe' или использование прок ess, то есть 'read -p 'Test Output' TMP &>/dev/null <<(echo 'test')' – user000001

+0

Даже 'shopt -s lastpipe && echo 'test' | read -p 'Test Output' TMP &>/dev/null' оставляет пустую '$ TMP'. К счастью, ваш пример команды даже работает с '&>/dev/null' в самом конце, поэтому это опция для этой функции. – David

+0

Обратите внимание, что опция 'lastpipe' работает только в неинтерактивных оболочках. Если вы проверите это на своем терминале, это не сработает – user000001

ответ

4

Что означает user000001, так это то, что все команды в конвейере bash выполняются в подоболочках. Итак, когда команда subshell, обрабатывающая команду read, выходит, переменная $ TMP также исчезает. Вы должны учитывать это и либо:

  1. ИЗБЕЖАТЬ подоболочки (примеры, приведенные в комментариях выше)
  2. сделать всю работу с переменными в том же подоболочках

    echo test | { read value; echo subshell $value; }; echo parent $value 
    
  3. использовать другую оболочку

    $ ksh -c 'echo test | { read value; echo subshell $value; }; echo parent $value' 
    subshell test 
    parent test 
    
+0

** Подстановка процесса **, упомянутая @ user000001, сделала трюк - 'read -p 'Test Output' TMP <<(echo 'test') &>/dev/null' работает точно так, как я хочу. Обучение никогда не прекращается. :) – David

+0

Я только понял, что это не поможет мне в определенных ситуациях, но это не имеет никакого отношения к ответу. То есть при повторении содержимого файла через мою функцию вывод полностью перенаправляется в журнал. Но я понял, что в этих случаях будет работать '2> $ {LOGFULL} #' в конце '' $ {2} "'. ^^ – David

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