Оболочка испускает сообщение об ошибке, когда она достигает строки 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
Можно окружить последовательность команд с круглыми скобками. Каждая команда в круглых скобках будет иметь доступ к тому же 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