2012-04-19 12 views
0

私はPIDファイルの制御のためのコードを手に入れました。bashのヒントを説明してください

プログラマーのスタイル、私は..

を理解していない私にはわからない - >

[[ $mypid -ne $procpid ]] **&&** 

上& &の

を使用し、適切に自分自身を再起動(しMacOSXでは動作しません)

$0 [email protected] & 

コード補完テ...

function createpidfile() { 
    mypid=$1 
    pidfile=$2 
    #Close stderr, don't overwrite existing file, shove my pid in the lock file. 
    $(exec 2>&-; set -o noclobber; echo "$mypid" > "$pidfile") 
    [[ ! -f "$pidfile" ]] && exit #Lock file creation failed 
    procpid=$(<"$pidfile") 
    [[ $mypid -ne $procpid ]] && { 
    #I'm not the pid in the lock file 
    # Is the process pid in the lockfile still running? 
    isrunning "$pidfile" || { 
     # No. Kill the pidfile and relaunch ourselves properly. 
     rm "$pidfile" 
     $0 [email protected] & 
    } 
    exit 
    } 
} 

+2

そのコードはかなりよく見えます。私はなぜ彼らが彼らのように機能の4行目を行ったのか分かりません。これらのコマンドのどれかが有効なコマンド名を生成しない限り、エラーでなければなりません。ワード分割に頼るのではなく、引用符で囲む必要があります。おそらく、これはnoclobberを分離するための '$ '記号がないサブシェルであることを意味していました。また、 'function name(){'構文を使わないでください。 Bashの場合は 'name()'だけを使用してください。珍しいksh/bashポリグロットライブラリを使っているなら、 'function name {'を使ってください。 – ormaaj

+3

引数を空白で正しく保護するには、 '$ 0 $ @&'を '' $ 0 "" $ @ "&' - http://www.gnu.org/software/bash/manual/bashref.html#Specialに変更してください-Parameters –

答えて

1

[[ ! -f "$pidfile" ]] && exitは意味、私を失ったよ(short-circuit evaluationを使用して)「ファイルがない場合は、終了後、pidファイル$と呼ばれる」 - ファイルが存在する場合exitは評価されません。

$0 [email protected] &

  • $0 - (実行ファイル自体を意味する)、コマンドラインの最初の引数。
  • [email protected] - 残りの引数はすべてコマンドラインに渡されます。
  • & - 起動後にプロセスをバックグラウンドに送信します。
1
command1 && command2 

Command2ををCommand1をゼロの終了ステータスを返す場合に限り実行されます。

$0は、実際のバイナリの名前です。

[email protected]はすべてパラメータです。

そして終了&はプロセスをバックグラウンドに送信します。

すべてがbash manualに記載されています。セクション3.4.2 Special Parameters

+0

_command2は、command1が終了ステータスを返す場合にのみ実行されます。** **ゼロ以外** **( 'command1'が0と評価されるため、評価する意味がありません。 'command2' - 式は偽であることが保証されます)。 –

+0

@AlexanderPavlov - その行はbash-manualのコピー・ペーストですが、もちろん正しいです。 –

+0

ああ... bashマニュアルを修正する時... –

1
  1. &&は論理ANDです。

    条件[[ $mypid -ne $procpid ]]が真の場合、ブロック{...}のコードが実行されます。

  2. $0 [email protected] &(同じ引数を使用して)バックグラウンドでスクリプトを再起動します。

    • $0

      は、前のコマンドがバックグラウンドで実行されるべきであることを示すスクリプト

    • &に渡されるすべての引数のリストスクリプト

    • [email protected]を起動したコマンドです

1

これはboolean short-circuitingです。&&(および)演算子の前のビットがfalseと評価された場合、2番目の部分({}の間のブロック)を実行する必要はありません。 ||演算子では同じトリックが使用され、最初のブロックがfalseを返した場合に2番目のブロックのみが実行されます。

関連する問題