タグ付けされた質問 「trap」

3
「トラップ…INT TERM EXIT」は本当に必要ですか?
クリーンアップタスクにtrap使用する多くの例trap ... INT TERM EXIT。しかし、3つのsigspecをすべてリストすることは本当に必要ですか? マニュアルによると: SIGNAL_SPECがEXIT(0)の場合、シェルの終了時にARGが実行されます。 スクリプトが正常に終了したか、または受信したSIGINTか終了したかに関係なく適用されると信じていますSIGTERM。また、実験は私の信念を確認します: $ cat ./trap-exit #!/bin/bash trap 'echo TRAP' EXIT sleep 3 $ ./trap-exit & sleep 1; kill -INT %1 [1] 759 TRAP [1]+ Interrupt ./trap-exit $ ./trap-exit & sleep 1; kill -TERM %1 [1] 773 TRAP [1]+ Terminated ./trap-exit では、なぜそんなに多くの例がすべてをリストしているのINT TERM EXITでしょうか?または、私は何かをEXIT見逃しましたか?足裏が見逃す場合がありますか?
63 bash  shell  signals  trap 


6
トラップ、ERR、およびエラー行のエコー
トラップを使用してすべてのエラーで関数を呼び出すエラー報告を作成しようとしています: Trap "_func" ERR ERR信号の送信元の行を取得することはできますか?シェルはbashです。 それを行うと、使用されたコマンドを読んで報告し、いくつかのアクションを記録/実行できます。 それとも私はこれですべて間違っていますか? 私は以下でテストしました: #!/bin/bash trap "ECHO $LINENO" ERR echo hello | grep "asdf" そして$LINENO2を返しています。動作していません。

2
`set -eu`を使用する場合のEXITおよびERRトラップの正しい動作
set -e(errexit)、set -u(nounset)とともにERRおよびEXITトラップを使用すると、奇妙な動作が見られます。それらは関連しているように見えるので、それらを1つの質問に入れるのは合理的です。 1)set -uERRトラップをトリガーしません コード: #!/bin/bash trap 'echo "ERR (rc: $?)"' ERR set -u echo ${UNSET_VAR} 予期:ERRトラップが呼び出されます。RC!= 0 実際:ERRトラップは呼び出されません、RC == 1 注:set -e結果は変わりません 2)set -euEXITトラップでの終了コードの使用は1ではなく0です コード: #!/bin/bash trap 'echo "EXIT (rc: $?)"' EXIT set -eu echo ${UNSET_VAR} 予期:EXITトラップが呼び出されます、RC == 1 実際:EXITトラップが呼び出され、RC == 0 注:を使用するset +e場合、RC == 1です。他のコマンドがエラーをスローすると、EXITトラップは適切なRCを返します。 編集:このトピックには、使用されているBashバージョンに関連している可能性があることを示唆する興味深いコメントを含むSO投稿があります。このスニペットをBash 4.3.11でテストすると、RC …

1
bash-builtinがCPUを100%焼くのを待つ
少なくともGNU bashバージョン4.3.42 x86_64 && GNU bashバージョン4.3.11 x86_64で発生します シグナルによって割り込み可能にするために(SIGUSR1として)sleep & wait $!単純な代わりに使用します。ただし、次のコマンドを実行すると、bashビルトインが奇妙な動作をするようです。sleepsleepwait ターミナル1: cat <( trap 'echo SIGUSR1' SIGUSR1; echo $BASHPID; while :;do sleep 1 & wait $!; echo test; done )& ターミナル2: kill -10 /the pid of the subshell, printed by the previous command/ ターミナル1: ^C (ctrl + C) 次に、CPUを100%燃焼させるサブシェルを取得します。 …

3
トラップはサブシェルに継承されますか?
私は次のスクリプトを試しました: #!/bin/bash trap 'echo "touching a file" && touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo 上記のスクリプトの出力は次のとおりです。 [root@usr1 my_tests]# ./test.sh foo1 foo touching a file ただしfoo1、サブシェルで呼び出されるトラップも終了時に呼び出されることを期待していました。 これは予想されますか? さtrapサブシェルによって継承されましたか? はいの場合、どのような場合にtrapサブシェルに継承されますか?
14 shell  trap  subshell 

4
SIGINTなどをトラップするときに終了コードを保持しますか?
trapたとえばhttp://linuxcommand.org/wss0160.php#trapで説明されているように使用してctrl-c(または類似のもの)をキャッチし、終了する前にクリーンアップすると、返される終了コードが変更されます。 これはおそらく現実の世界では違いはありません(たとえば、終了コードは移植可能ではなく、その上に、プロセスが終了したときのデフォルトの終了コードで説明されているように常に明確であるとは限らないためです)。それでも、本当にそれを防ぎ、代わりに中断されたスクリプトのデフォルトのエラーコードを返す方法はありませんか? 例(bashですが、私の質問はbash固有のものと見なすべきではありません): #!/bin/bash trap 'echo EXIT;' EXIT read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _ trap 'echo SIGINT; exit 1;' INT read -p 'If you ctrl-c me now my return code will be 1. ' _ 出力: $ ./test.sh …

2
Trapコマンドを使用してエラーをトリガーする方法
Ubuntu 12.04.2を使用しています。「トラップ」コマンドを使用してシェルスクリプトの異常またはエラーをキャプチャしようとしていますが、「エラー」終了を手動でトリガーしようとしています。 exit 1を試しましたが、「エラー」信号はトリガーされません。 #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func 「エラー」終了信号を手動でトリガーする方法がわからない場合

3
bash関数でトラップを設定する方法は?
trapbashスクリプトではセットアップできますが、bash関数ではセットアップできません。 たとえば、source以下のコードを実行してf、今すぐCtrl+を試してみてくださいC。 trapbash関数で設定する方法は? 4 trap ctrl_c INT 5 6 ctrl_c () { 7 echo "** Trapped CTRL-C" 8 } 9 10 11 f () { 12 for i in `seq 1 100`; do 13 sleep 1 14 echo -n "." 15 done 16 }
13 bash  trap 

1
SIGINTシグナルをトラップしようとするとエラーメッセージが表示されるのはなぜですか?
以下のスクリプトを実行して、lftpを使用してサーバーからファイルを自動的にダウンロードしています。動作するときにエラーメッセージが表示されることを除いて動作します trap: SIGINT: bad trap SIGINTとSIGTERMをINTとTERMに置き換えると機能しますが、同じ目的を達成できるかどうかはわかりません。これはLinux Debian 4.9.2-10にあります。 #!/bin/sh login="login" pass="password" host="server.server.com" remote_dir='~/remote/dir' local_dir="/local/dir" base_name="$(basename "$0")" lock_file="/tmp/$base_name.lock" trap "rm -f $lock_file" SIGINT SIGTERM if [ -e "$lock_file" ] then echo "$base_name is running already." exit else touch "$lock_file" /usr/bin/lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF set sftp:auto-confirm yes set …
12 shell  trap 

6
バックグラウンドで静かにタスクを開始する
これを使用してプロセスがバックグラウンドで開始され、プロセスがバックグラウンドで実行されたときや、そのように実行されたときに通知を受け取らないことを知っています。 (コマンド&)&> / dev / null ただし、これにより、プロセスが終了したときにトラップするオプションが削除されます(trap child_done CHLD)。 どうすれば両方ができますか?
12 process  zsh  trap 

3
トラップコマンドの信号0とは何ですか?
私は、ssh-agentを使用してパスワードなしのSSH認証を設定する方法について、このガイドに従っています。 ssh-agentを起動するには、次のコードを推奨します.bash_profile。 SSHAGENT=/usr/bin/ssh-agent SSHAGENTARGS="-s" if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then eval `$SSHAGENT $SSHAGENTARGS` trap "kill $SSH_AGENT_PID" 0 fi なぜそれがによると、信号は0をトラップされて、私は理解していない男性7信号はそのような信号がありません。 これは単なるタイプミスかバグですか、それとも本当に何かを達成していますか?
12 bash  signals  trap 

1
シェルスクリプトのトラップ処理と暗黙のサブシェル
次のEXITようなトラップを介して、ある種のクリーンアップコードを実行するシェルスクリプトがあるとします。 #!/bin/bash mytrap () { echo "It's a trap!" >&2 } trap mytrap exit echo I am at the end of the script. これは、予想通り、It's a trap!スクリプトが終了したときに出力されます。 $ sh myscript I am at the end of the script. It's a trap! 次のように、スクリプトを変更して、最終的に別のコマンドにパイプ処理される出力を生成する関数を追加します。 #!/bin/bash mytrap () { echo "It's a trap!" >&2 …
12 shell  trap 

3
このスクリプトで開いているプロセスではなく、bashスクリプトの「Ctrl + c」をトラップします
私はbashスクリプトでインタラクティブなプログラムをしようとしました: my_program そして、「Ctrl + c」でそれを閉じたいと思います。しかし、それを実行すると、スクリプトも終了します。 私は知っています。 trap '' 2 my_program trap 2 しかし、この場合、my_programCtrl + cで閉じることができません。 プログラムでCtrl + cを許可し、実行中のスクリプトを閉じない方法はありますか? 編集:例を追加 #!/bin/bash my_program my_program2 Ctrl + cを使用して閉じるとmy_program、my_program2スクリプト全体が終了するため実行されません。
11 bash  trap 

2
139(セグメンテーション違反)を返すプログラムをbashでトラップするにはどうすればよいですか?
一部のプログラムをテストするbashスクリプトがあり、そのプログラムの1つが返されるSegmentation faultため、スクリプトの先頭にトラップを追加しようとしました。 trap "echo 'segfault occured!'" SIGSEGV しかし、それは何もしませんでした。使った echo $? segfaultを生成するプログラムの直後に、出力として139が表示されます。特定のエラーコードのトラップを追加するにはどうすればよいですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.