2017-11-17 6 views
0

に私は私のbashスクリプトの先頭に次のしている:私はこれを調達する場合(.を使用して)次のものを使用して終了:? bashの

"${PROJECT_DIR:?"Need to set PROJECT_DIR by sourcing <project dir>/setup.sh"}" 
echo "D'oh!" 

私は、次を得る:

-bash: PROJECT_DIR: Need to set PROJECT_DIR by sourcing <project dir>/setup.sh 
D'oh! 

私はときに終了し期待していました変数が設定されていません。何か不足していますか?

+3

'$ {name:?...}'は、非対話型シェルからのみ終了します。対話シェルからスクリプトを入手しましたか? – chepner

+1

Aha。それが問題です。これはインタラクティブです。 コマンドは機能しますが、シェルを終了することはありません –

+2

対話的に何かをソーシングするには、 'exit'ではなく' return'を使用します。そうしないと、呼び出しシェルが終了します。 –

答えて

2

残念ながら、:?は仕事に適したツールではありません。代わりに考えてみましょう:

[ -n "$PROJECT_DIR" ] || { 
    echo "Need to set PROJECT_DIR by sourcing <project dir>/setup.sh" >&2 
    return 1 || exit 1 
} 

returnは、それがsourceを呼び出す前にいた親インタプリタに飛び出し。失敗した場合、おそらくあなたのスクリプトはソースではなく実行されたので、代わりにexitにフォールバックします。

関連する問題