Questions tagged «trap»

3
“陷阱……INT TERM EXIT”真的必要吗?
对于许多例子trap使用trap ... INT TERM EXIT的清理任务。但是是否真的有必要列出所有三个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" 并$LINENO返回2。不起作用。

2
使用`set -eu`时正确的EXIT和ERR陷阱行为
与ERR和EXIT陷阱一起使用set -e(errexit),set -u(nounset)时,我观察到一些奇怪的行为。它们似乎相关,因此将它们放在一个问题中似乎是合理的。 1)set -u不触发ERR陷阱 码: #!/bin/bash trap 'echo "ERR (rc: $?)"' ERR set -u echo ${UNSET_VAR} 预期:ERR陷阱被调用,RC!= 0 实际:未调用ERR陷阱,RC == 1 注意:set -e不改变结果 2)set -eu在EXIT陷阱中使用退出代码是0而不是1 码: #!/bin/bash trap 'echo "EXIT (rc: $?)"' EXIT set -eu echo ${UNSET_VAR} 预期:调用EXIT陷阱,RC == 1 实际:调用EXIT陷阱,RC == 0 注意:使用时set +e,RC ==1。当任何其他命令引发错误时,EXIT陷阱将返回正确的RC。 编辑:关于该主题的一篇SO帖子带有一个有趣的注释,表明这可能与所使用的Bash版本有关。使用Bash 4.3.11测试此代码段会导致RC = …

1
等待bash-builtin以100%的速度消耗CPU
至少在GNU bash版本4.3.42 x86_64和&GNU bash版本4.3.11 x86_64上发生 我用sleep & wait $!一个简单的方法而不是简单的方法sleep来获得sleep信号的可中断性(如SIGUSR1)。但是wait当您运行以下命令时,bash-builtin的行为似乎很奇怪。 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) 然后,我得到了以100%消耗CPU的子外壳。 1号航站楼: pkill …

3
陷阱是由subshel​​l继承的吗?
我尝试了以下脚本: #!/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 但是,我也希望在退出时也要调用trap foo1,这是在子shell中调用的。 这是预期的吗? 是trap由subshel​​l继承的吗? 如果是,那么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
如何使用陷阱命令触发错误
我正在使用Ubuntu 12.04.2。我正在尝试使用“ trap”命令捕获外壳脚本中的异常或错误,但是我也试图手动触发“错误”退出。 我尝试退出1,但不会触发“错误”信号。 #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func 不确定如何手动触发“错误”退出信号?

3
如何在bash函数中设置陷阱?
我可以trap在bash脚本中设置,但不能在bash函数中设置。 例如,source下面的代码run f,现在尝试Ctrl+ C,它没有被捕获! 如何trap在bash函数中设置? 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 如果我用INT和TERM替换SIGINT和SIGTERM,那么它确实可以工作,但是我不知道它是否能达到相同的目的。这是在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。根据man 7信号,没有这样的信号。 这仅仅是错别字或错误,还是真的有成就?
12 bash  signals  trap 

1
外壳程序脚本中的陷阱处理和隐式子外壳
假设您有一个Shell脚本,该脚本通过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
陷阱'Ctrl + c'用于bash脚本,但不用于在该脚本中打开进程
我试图在bash脚本中有一个交互式程序: my_program 我希望能够使用“ Ctrl + c”将其关闭。但是,当我这样做时,我的脚本也会关闭。 我知道 trap '' 2 my_program trap 2 但是在这种情况下,我无法my_program使用Ctrl + c 关闭。 您是否知道如何在程序上允许Ctrl + c而不关闭运行脚本的脚本? 编辑:添加示例 #!/bin/bash my_program my_program2 如果我使用Ctrl + c关闭my_program,my_program2则不会执行,因为会退出整个脚本。
11 bash  trap 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.