Острота Shell для добавления строки посреди канала

Оболочка испускает сообщение об ошибке, когда она достигает строки 5. Поток сообщений об ошибках оболочки не перенаправляется в этой точке.

Если Вы пишете date= $(date) 2>/dev/null, “команда, не найденная” сообщение, прибывает из оболочки, не из команды, поток сообщений об ошибках которой перенаправляется. Поэтому Вы будете все еще видеть сообщение об ошибке.

Чтобы постараться не видеть сообщение об ошибке, поместите целую команду в группе и перенаправьте поток сообщений об ошибках от целой группы:

{ date= $(date); } 2>/dev/null

С фигурными скобками команда все еще выполняется в родительской оболочке, таким образом, она может изменить свою среду и другое состояние (не, что она делает здесь). Можно также поместить команду в тело функции, или в подоболочку (команды в круглых скобках, которые выполняются в отдельном процессе оболочки).

Можно перенаправить дескрипторы файлов оболочки постоянно (или по крайней мере до в следующий раз, когда Вы изменяете их) при помощи перенаправления на exec встроенный без названия команды.

exec 2>/dev/null
# From this point on, all error messages are lost
date= $(date)
…
exec 2>/some/log/file
# From this point on, all error messages go to the specified file
6
19.01.2014, 19:49
1 ответ

Можно окружить последовательность команд с круглыми скобками. Каждая команда в круглых скобках будет иметь доступ к тому же stdin, stdout, и stderr. Здесь, echo отправит к stdout, но не изменит stdin это grep видит.

cpp $1 | (echo 'your constant line here'; grep -v "#") | theprogram

Как описано на командном языке Shell: группируя команды, можно использовать фигурные скобки вместо круглых скобок для группировки. Используя фигурные скобки немного более эффективно, так как подоболочка не будет создана, но она представляет более сложный синтаксис: должен быть разделитель полей после {, и разделитель такой как ; или новая строка перед }. Но несколько человек предложили это в качестве альтернативы, таким образом, здесь это:

cpp $1 | { echo 'your constant line here'; grep -v "#"; } | theprogram
7
27.01.2020, 20:27
  • 1
    Вы не нуждаетесь в подоболочке здесь, просто используете оперативную группу штаба. –  Chris Down 20.01.2014, 08:36

Теги

Похожие вопросы