我正在遵循有关如何使用 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
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它会捕获信号 0。根据man 7 signal没有这样的信号。
这只是一个错字或错误,还是真的有什么成就?
我可以trap在 bash 脚本中进行设置,但不能在 bash 函数中进行设置。
比如source下面的代码并运行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 }
Run Code Online (Sandbox Code Playgroud) 假设您有一个 shell 脚本,它通过EXIT陷阱运行某种清理代码,如下所示:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这将It's a trap!在脚本退出时打印出来:
$ sh myscript
I am at the end of the script.
It's a trap!
Run Code Online (Sandbox Code Playgroud)
您修改脚本以添加一个函数,该函数生成一些最终通过管道传输到另一个命令的输出,如下所示:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
myfunc () {
echo "I've got a bad feeling about this..."
}
trap mytrap exit
myfunc | cat > /dev/null
echo I am …Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本来测试一些程序,其中一个程序返回,Segmentation fault所以我试图在我的脚本的头部添加一个陷阱:
trap "echo 'segfault occured!'" SIGSEGV
Run Code Online (Sandbox Code Playgroud)
然而这并没有起到任何作用。我用了
echo $?
Run Code Online (Sandbox Code Playgroud)
就在产生段错误的程序之后,我得到139作为输出。如何为该特定错误代码添加陷阱?
考虑到父程序(可以是 C++ 程序或 Shell 脚本)执行子 Shell 脚本的场景,当我们在执行子 Shell 脚本时点击 Control+C(或任何配置为 INTR 字符的字符), SIGINT 被发送到前台进程组中的所有进程。这包括父进程。
来源:POSIX.1-2008 XBD 第 11.1.9 节
有没有办法覆盖这个默认行为?CHILD 进程单独处理信号而不将其传播给父进程?
我有一个 bash 脚本,其中我执行一行,睡眠一段时间然后tail -f我的日志文件来验证某个模式被看到,我按 ctrl + c 退出tail -f然后移动到下一行,直到 bash 脚本完成执行:
这是我迄今为止所做的:
#!/bin/bash
# capture the hostname
host_name=`hostname -f`
# method that runs tail -f on log_file.log and looks for pattern and passes control to next line on 'ctrl+c'
echo "==================================================="
echo "On $host_name: running some command"
some command here
echo "On $host_name: sleeping for 5s"
sleep 5
# Look for: "pattern" in log_file.log
# trap 'continue' SIGINT
trap 'continue' SIGINT
echo "On $host_name: post update …Run Code Online (Sandbox Code Playgroud) 我试图在 bash 脚本中有一个交互式程序:
my_program
Run Code Online (Sandbox Code Playgroud)
我希望能够用 'Ctrl + c' 关闭它。但是当我这样做时,我的脚本也正在关闭。
我知道。
trap '' 2
my_program
trap 2
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我无法my_program用 Ctrl + c关闭。
您知道如何在程序上允许 Ctrl + c ,但不关闭运行它的脚本吗?
编辑:添加示例
#!/bin/bash
my_program
my_program2
Run Code Online (Sandbox Code Playgroud)
如果我使用 Ctrl + c 关闭my_program,my_program2则永远不会执行,因为整个脚本已退出。
如果我trap两次发出内置命令 [对于相同的信号],会发生什么?第二个命令是添加到第一个命令中,还是替换第一个命令?
trap Foo SIGINT
...
trap Bar SIGINT
...
Run Code Online (Sandbox Code Playgroud)
当 SIGINT 发生时,Bash 是直接运行Bar还是同时运行Foo?或者是其他东西...?
这是一个简单的脚本,它在当前目录中设置一个临时目录,并在退出时设置一个陷阱以将其删除。
#filename: script
set -x
trap 'rm -rf "$d"' exit
d=`TMPDIR=$PWD mktemp -d`
"$@"
Run Code Online (Sandbox Code Playgroud)
如果我执行ksh script sleep 100或bash script sleep 100中断它C-C,则执行陷阱并删除目录。它不适用于dash. 为什么?这是错误还是预期行为?
我相信Ctrl-C可以被困在 bash 脚本中。是否也可以将其捕获在 awk 脚本中以处理该事件?
例如,对于中止处理,但打印已经处理过的结果,而不是只是默默地退出?