7

引数に渡された文字列を含むすべての Mercurial 変更セット (ヒントから開始) を見つけるために、小さな Bash スクリプトを作成しました。

#!/bin/bash

CNT=$(hg tip | awk '{ print $2 }' | head -c 3)
while [ $CNT -gt 0 ]
do
    echo rev $CNT
    hg log -v -r$CNT | grep $1       
    let CNT=CNT-1
done

ctrl-c を押して中断すると、多くの場合、現在実行されているコマンドは "hg log" であり、中断されるのはそのコマンドですが、スクリプトは続行されます。

そこで「hg log」の戻り状況を確認しようと思ったのですが、grepでパイプしているのでどうしたらいいのかわかりません...

中断された場合、このスクリプトを終了するにはどうすればよいですか? (ところで、そのスクリプトが私がやりたいことにまったく適しているかどうかはわかりませんが、それは仕事をし、とにかく「中断」の問題に興味があります)

4

3 に答える 3

6

スクリプトの先頭に配置します。trap 'echo interrupted; exit' INT

編集:以下のコメントに記載されているように、パイプが原因で OP のプログラムではおそらく機能しません。解決策は$PIPESTATUS機能しますが、パイプ内のプログラムがエラー ステータスで終了した場合に終了するようにスクリプトを設定する方が簡単な場合があります。set -e -o pipefail

于 2010-03-31T09:17:09.970 に答える
5

$PIPESTATUS 配列を使用して失敗をチェックし、次のようにスクリプトを書き直します。

#!/bin/bash

CNT=$(hg tip | awk '{ print $2 }' | head -c 3)
while [ $CNT -gt 0 ]
do
    echo rev $CNT
    hg log -v -r$CNT | grep $1
    if [ 0 -ne ${PIPESTATUS[0]} ] ; then
            echo hg failed
            exit
    fi     
    let CNT=CNT-1
done
于 2010-03-31T09:27:00.133 に答える
1

この$PIPESTATUS変数を使用すると、パイプのすべてのメンバーの結果を確認できます。

于 2010-03-31T09:14:27.313 に答える