2つのスクリプトがあります。
fail_def.sh:
#!/bin/bash -eu
function fail() {
echo -e "$(error "$@")"
exit 1
}
bla.sh:
#!/bin/bash -eu
fail "test"
その後source fail_def.sh
、ターミナルで問題なくfailコマンドを使用できます。ただし、電話をかけるとbla.sh
、常にが表示されline 2: fail: command not found
ます。
経由で呼び出すか./bla.sh
、bashbla.sh
またはbash./bla.sh
で呼び出すかは関係ありませんが、エラーは残ります。
source fail_def.sh
冒頭に追加bla.sh
することで問題は解決しますが、避けたいと思います。
必要に応じて、Macで実行されているUbuntudockerコンテナに取り組んでいます。
私はその問題をグーグルで検索しようとしましたが、いくつかの同様の問題が見つかりましたが、それらのほとんどはファイルを調達しないか、異なるシェル実装を混同することに関連しているようです。どちらもここでは当てはまらないようです。
スクリプト内でfailコマンドを機能させるにはどうすればよいですか?
期待です!
シェルは、常に別のプロセスとして、したがって別のシェル名前空間で、シバンセパレーターを使用して実行されるスクリプトを実行します。スクリプトが実行される新しいシェルには、関数source'dがありません。
このような情報をデバッグするにecho $BASHPID
は、現在のbashプロセスのプロセスIDを、bla.sh
その行#!/bin/bash -eu
とテスト結果が生成された後にスクリプトに出力する行を追加します。
$ echo $BASHPID
11700
$ bash bla.sh
6788
fail.sh: line 3: fail: command not found
これらは、インポートされた関数が共有されない別のプロセスで実行したスクリプトです。方法の1つは、2番目のスクリプトで独自のエラー処理を行い、2番目のスクリプトをソース化することです。2番目のスクリプト
$ cat fail.sh
echo $BASHPID
set -e
fail "test"
set +e
今それを実行しています
$ source fail.sh
11700
11700
bash: error: command not found
error
利用可能なシェル組み込みではないので、これは明らかです。上記の場合と同じプロセスIDを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加