set -uの使用が期待どおりに機能しない


12

setスクリプトでさまざまなオプションを効率的に使用する方法を学習してset -uいて、変数が正しく設定されていない場合(ユーザーの削除など)にスクリプトを終了するのに最適なようです。マニュアルページによると、次のことset -uset -eしています...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

この機能をテストするためのテストスクリプトを作成しましたが、期待どおりに動作していないようです。おそらく、誰かが私の問題を私に説明し、どこで私が誤解しているのでしょうか?テストスクリプトは次のとおりです。ありがとうございました。

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

スクリプトが0"これで機能します"を表示し、${testing2}設定されていないため失敗することを期待しています。

代わりに私が表示されています0をし、「この作品は」、で続く0、その後、0は これが表示されることはありません

誰かがいくつかの知識を提供できますか?ありがとうございました。


1
だからフォローアップ...変数をnull文字列に設定することを違法にする/エラーを発生させる方法はありますか?私はそうではないと思います。
ルークデイビス

回答:


10

「man Bash」から:

パラメータは、値が割り当てられている場合に設定されます。null文字列は有効な値です。変数が設定されると、unset組み込みコマンドを使用することによってのみ、変数を設定解除できます。

あなたが行うときtesting2=、あなたはヌル文字列に変数を設定しています。

に変更してunset testing2、再試行してください。


set -e割り当ては1の終了コードを持っていることはありませんこの場合の助けにはならないと、最後に実行したコマンド(割り当て)が0の終了コードを持っている、またはことを確認するために、これを試してみてください、この質問を読んで

$ false; a=""; echo $?
0

そして、私はまた、set -eの使用は解決策よりも問題であると信じています。

未設定の変数を使用するとエラーが発生する可能性があるのはset -u次のとおりです。

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

出力されます:

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

3

testing2=testing2変数を空の文字列に設定します。変数は実際に設定されます。

ただしecho $testing99、対話型のBashシェルで実行すると(errexitつまりを設定せずにset -e)、エラーが発生します。

bash: testing99: unbound variable

さておき

ちょうど今、スクリプトをテストしている間、私がいることを発見し、対話型シェルは 常に終了していない変数拡大しようとしたときに設定されていない一方、非対話型シェル(シェルスクリプトを実行している)は常に終了します。POSIX manページによるとset

-uシェルは、設定されていない変数を展開してすぐに終了しようとしたときに、標準エラーにメッセージを書き込みます。対話型シェルは終了しません。

インタラクティブBashシェル、設定されerrexitていない限り終了しません。一方、インタラクティブダッシュシェルは、以前に実行されていても終了しません。set -e


ダッシュがset -eで終了しない場合。セット-u; aaの設定を解除します。$ aaをエコーし​​、ダッシュが間違っています。
schily 2016年

@schily私がこれに最初に気付いたとき、ダッシュの作者は私よりもよく知っていて、POSIX仕様にあいまいさがいくつかあるかもしれないが、pubs.opengroup.org / onlinepubs / 9699919799 / utilities /…を再チェックしたことに気付いた。バグのように見えることに同意します。
Anthony Geoghegan

単純なルールがあります。KornシェルとBourneシェルの両方が一致し、別のシェルの実装に偏差がある場合、他のシェルは正しく動作しません。
schily 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.