コマンドの失敗時に「source」dスクリプトを自動で返す


2

source内部のコマンドが失敗した場合、dスクリプトを自動復帰させるにはどうすればよいですか?

たとえば、失敗時に自動終了するスクリプトがあるとしますset -e。たとえば、

#!/bin/bash
# foo.env
set -e        # auto-exit on any command failure
echo "hi"
grep 123 456  # this command will fail (I don't have a file named "456")
echo "should not reach here"

コマンドを正常に実行すると、失敗したgrepコマンドで自動的に終了します。

box1% ./foo.env
hi
grep: 456: No such file or directory

ただし、sourceスクリプトを実行すると、ソースとなるスクリプトだけでなく、現在のシェルが終了します。

box1% ssh box2
box2% source ./foo.env
hi
grep: 456: No such file or directory
Connection to box2 closed.
box1%

を削除するとset -e

#!/bin/bash
# foo2.env
echo "hi"
grep 123 456  # this command will fail (I don't have a file named "456")
echo "should not reach here"

次に、sourcedスクリプトを自動で終了したり、自動で返したりしません。

box1% ssh box2
box2% source ./foo2.env
hi
grep: 456: No such file or directory
should not reach here
box2%

これまでに見つけた唯一の回避策returnは、スクリプト内のコードのすべての行に式を追加することです。

box1% cat foo3.env
#!/bin/bash
# foo3.env - works, but is cumbersome
echo "hi" || return
grep 123 456 || return
echo "should not reach here" || return

box1% source foo3.env
hi
grep: 456: No such file or directory
box1%

以下のための別の方法があるsourceDスクリプトはどのように似て、set -e非のために働くsourceDのもの?

回答:


1

sourceスクリプトを作成するときは、キーボードから1行ずつそのファイルを書いているようなものです。これはset -e、現在のシェルを考慮し、エラー時に現在のシェルを終了することを意味します。

これは回避策です。今日、私は怠laだと感じているので、コンピューターが私のために書くことができる||return、またはファイルを1行ずつ読み取って実行する方が良いと考えました:

#!/bin/bash
# this is the file MySource.sh
while IFS='' read -r line
do
   [[ $line == \#* ]] || $line || return
done < "$1"

で実行する . MySource.sh FileToBeSourced.sh

FileToBeSourced.shスクリプトに1行のコマンドが含まれている場合、動作するはずです。
実稼働環境で使用する準備ができている、遠く離れています。
それをテストし、最終的には自己責任で使用してください

#エラーが発生するはずなので、先頭の行をスキップします# command not found


それは賢いトリックです。私のスクリプトは多くの行にまたがっていることがわかったので、より洗練されたパーサーを作成する必要があります。たぶん、最良の方法はパーサーを見つけるか、Perlでハックして、コマンドの代わりにコマンドをストリームすることですread
Mr Fooz

@MrFooz:ありがとう、ただのアイデアでした。空想パーサあなたは無様を取り除くことができ[[ $line == \#* ]] || 、あまりにも。たぶん、あなたはループの終わりに解析された出力を置くことができますdo.. done <<< $( FancyParser.sh "$1" )
-Hastur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.