11

このスクリプトを取る

#!/bin/sh

fd ()
{
  echo Hello world
  exit
}

trap fd EXIT INT

for g in {1..5}
do
  echo foo
  sleep 1
done

fdControl-C から、またはスクリプトが正常に終了した場合に、一度起動したいと思います。ただし、Control-C を押すと、2 回実行されます。どうすればこれを修正できますか?

4

3 に答える 3

11

カスケード トラップを実行します。exit 127トラップを実行しEXIT、終了コードを 127 に設定します。

#!/bin/sh

fd () {
  echo Hello world
  # No explicit exit here!
}

trap fd EXIT
trap 'exit 127' INT

あなたの問題に対するさまざまな回避策に数年間苦労した後、他の人のスクリプトからこれを学んだことを覚えています。その後、いくつかのチュートリアルでこの手法が説明されていることに気付きました。しかし、Bash のマニュアル ページ IMHO などでは明確に文書化されていません。(または、必要なときにそうではありませんでした。15年経っても変わらないものもあるかもしれません... :-)

于 2013-01-11T09:42:41.770 に答える
0

トラップのデフォルトを再定義する場合はどうですか?

#!/bin/sh

fd () {
   echo Hello world
   trap - EXIT
   exit 127
}

trap fd INT EXIT
于 2013-03-19T18:15:26.043 に答える
0

pstのコメントに触発されました

fd ()
{
  echo Hello world
  trap - EXIT INT
  exit
}
于 2013-01-11T09:44:52.127 に答える