Я использую bash и пытаюсь напечатать сообщение со стандартной ошибкой, если переменная не установлена с помощью следующей команды:

echo ${var:?"This var is not set"}

Теперь я хочу перенаправить это сообщение об ошибке в файл. Я попробовал следующее, но это не сработало:

echo ${var:?"This var is not set"} > testfile

Не сработало и следующее:

echo ${var:?"This var is not set"} 2> testfile

Итак, как я могу направить это сгенерированное сообщение в файл?

1 ответ1

0

Из справочного руководства Bash:

${parameter:?word}

Если parameter равен нулю или не задан, расширение word (или сообщение на этот счет, если word отсутствует) записывается со стандартной ошибкой, и оболочка, если она не является интерактивной, завершается. В противном случае значение parameter подставляется.

Это может быть неочевидно, но "стандартная ошибка" здесь означает стандартную ошибку оболочки. Когда вы делаете echo … 2> testfile вы перенаправляете стандартную ошибку echo . Они оба обычно оказываются в вашем терминале, но не совпадают.

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

(echo ${var:?"This var is not set"}) 2> testfile

Это также будет работать:

{ echo ${var:?"This var is not set"}; } 2> testfile

Обратите внимание, что фактическая команда (echo) унаследует уже перенаправленную стандартную ошибку подоболочки, поэтому фактически это перенаправление затрагивает их обоих. Вряд ли когда-либо имеет значение, когда команда является echo но с командой, которая возвращает сообщение об ошибке, это делает. Для сравнения:

unset var
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile
var=foo
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .