Как перенаправить stderr синтаксиса $ ?

264
Amjad Abdullah

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

echo $ 

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

echo $ > testfile 

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

echo $ 2> testfile 

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

0

1 ответ на вопрос

0
Kamil Maciorowski

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

$ 

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

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

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

(echo $) 2> testfile 

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

{ echo $; } 2> testfile 

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

unset var (dd $) 2> testfile cat testfile var=foo (dd $) 2> testfile cat testfile