do.sh
私はファイルの内容を読むためにbashコマンドライン設定を使用しています。このファイルの各行を1行ずつ実行して、後で中間行のエラーを処理し、後続の内容の実行を停止するスクリプトにテキストを追加できるようにします。私が使用する構文は次のとおりです。
cat do.sh|while read lin;do (echo $(" $lin")) ;done
echo $amit
do.shの内容が次のようになるとします。
amit=3
ram=/path/to/some/dir
ls >> amit.log
amit
最後に、2つの変数(たとえば、、)の内容にアクセスできる必要があり、ram
コマンドの出力はエラーを特定できません。ls
に保存する必要があります。amit.log
ベストアンサー1
標準の getpoint スクリプトの使用
. ./do.sh
または非標準
source ./do.sh
...スクリプトを実行し、生成された変数を現在の環境に保持する方法(そして出力を含むファイルを生成する方法ls
)だけを要求する元の質問を解決します。
更新された質問では、エラーが発生したときにスクリプトソースをすぐに終了する方法についても尋ねます。 「エラー」は、一部のコマンドがゼロ以外の終了状態で終了したことを意味すると仮定します。
set -e
通常、最初のエラーで終了するようにアクティブなスクリプトを実行できますが、スクリプトは必ず源泉、私たちはこれを行うことはできません(現在のシェルを終了します)。代わりに、bash
コマンドがゼロ以外の終了状態で終了したときに任意のコマンドを即座に実行できる関数を使用できます。実行しようとするコマンドは、return
エラーが発生するとすぐに実行されます。これによりスクリプトの実行が停止し、$?
現在のシェルの終了ステータスが返されます。
だから:
trap 'err=$?; trap - ERR; return "$err"' ERR
. ./do.sh
trap - ERR
これによりERR
トラップがコマンドに設定されますerr=$?; trap - ERR; return "$err"
。このコマンドはすべてのエラーに対して実行され、終了ステータスをに保存し、トラップをオンにし、エラーをシェルerr
に返します$?
(終了ステータスも変数に保持しますerr
)。最後に、トラップをデフォルト値にtrap - ERR
リセットします。ERR
例:
false
失敗したコマンドのシミュレーションに使用した呼び出しを含めるようにスクリプトが変更されました。変数は設定されますが、amit.log
ファイルは生成されません。
$ cat do.sh
amit=3
ram=/path/to/some/dir
false
ls >> amit.log
次のコマンドを実行してください。
$ trap 'err=$?;trap - ERR;return "$err"' ERR
$ . ./do.sh
$ trap - ERR
変数を取得しましたが、ファイルがまだ作成されていないことを示します。
$ printf '%s\n' "$amit" "$ram"
3
/path/to/some/dir
$ ls
do.sh