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