2016-05-05 5 views
3

私は過去のコマンドが正常に終了した後に実行する必要があるコマンドがたくさんあります。私は最初に& &を使って仕事を始めましたが、その結果として始まったのはかなり長い行です。シェルで以前に実行されたコマンドの終了コードに依存するbashスクリプトを作成できますか?

私は同じタスクを達成することができる自分のスクリプトを作成しようと決心しましたが、一度に1行ずつ実行できます。私はthenDoそれと呼ばれ、ここで私が持っているものだしました:

#!/bin/bash 

errorCode=$? 
if [[ $errorCode -eq 0 ]]; then 
    [email protected] 
    errorCode=$? 
fi 
return $errorCode 

私は$?の値は、実行のさまざまな段階にあったものを見るために様々な修正の束でこれを実行してみました。 $?の開始値が常に0であるため、このスクリプトは常にクリーンスレートで開始されるようです。

今のところ私は.bashrcで機能を作っていますが、それは私のシェルではうまくいくようですが、他のスクリプトで再度呼び出されるようにこのスクリプトが必要ですこの関数は、さまざまな、時にはネストされたスクリプト呼び出しによって常に持続するとは限りません。

私は、関数の代わりに独自のスクリプトでこれを行う方法を見つけることができれば本当にうれしいでしょう。それを実現させる方法はありますか?

+0

スクリプトの先頭に 'set -e'を追加するか、またはshebangを'#!/ bin/bash -e'に変更するか、手動で 'bash -e scriptfile'で開始してください – anishsane

+0

代わりにスクリプトが必要な理由はありますか関数の? – 123

+0

あなたの質問に答えて - いいえ、あなたのスクリプトは新しいbashプロセスになり、その親で実行されたコマンドの終了ステータスを見たり知ったりしないので、スクリプトではできません。 Walter Aが関数ライブラリを使用し、それを他のスクリプトに組み込む方法はアドバイスです。ところで、関数を 'export -f someFunction'を使ってサブシェルに伝播することができます –

答えて

1

さまざまなスクリプトで機能を共有する場合は、いくつかのユーティリティスクリプトとsourceこれらのスクリプトを含むディレクトリを作成することを検討してください。
おそらくfind dir of current scriptを使用して、実行中のスクリプトに関連してutil libを見つける必要があります。あなたのケースでは

# example file sourcing files in your own dir, stored in the var `shlib`. 
source "${shlib}"/thenDo 
source "${shlib}"/sqlutils 

、私はthenDoソリューションを使用しますが、いくつかのラインであなたのコマンドを記述するためのバックスラッシュを使用することはありません。

action1 && 
action2 with a lot of arguments that \ 
    may continue on the next line when \ 
    you end each line with a backslash \ 
    except at the end of your command && 
action3 && 
action4 | 
    pipe_also_does_not_need_backslash && 
action5 

\が最後の文字でなければならないことだけを覚えています行(それの後ろにスペースはない)。

+0

' && 'を行の最後に置くことができず、次の行を次の行に置くことはできませんでした。これは私のスクリプトの必要性を完全に否定します!ありがとう! :) – Altece

関連する問題