Из справочного руководства 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