我想要一个无限循环继续运行,并且只被一个终止信号暂时中断。我试过 SIGINT、SIGUSR1、SIGUSR2。他们似乎都停止了循环。我什至尝试过 SIGINFO,但 Linux 不支持。
#!/bin/bash
echo $$ > /tmp/pid # Save the pid
function do_something {
echo "I am doing stuff" #let's do this now, and go back to doing the thing that is to be done over and over again.
#exit
}
while :
do
echo "This should be done over and over again, but always wait for someething else to be done in between"
trap do_something SIGINT
while `true`
do
sleep 1 #so we're waiting for that …Run Code Online (Sandbox Code Playgroud) 我在几个地方(包括 SO)读过-e被认为是“糟糕的形式”并且在出现任何错误时退出脚本是不可靠的。处理错误的更好方法似乎是使用trap,例如:
trap "echo there was an error; exit 1;" ERR
Run Code Online (Sandbox Code Playgroud)
我似乎无法在手册页中找到ERR实际信号是什么?我假设它是,SIGQUIT但我无法确定。
man 7 signal
Run Code Online (Sandbox Code Playgroud)
只有您期望的正常信号SIGTERM SIGQUIT SIGINT等。
man trap
Run Code Online (Sandbox Code Playgroud)
有对ERR信号的引用,但似乎没有定义它。
例如:“ A trap on ERR, if set, is executed before the shell exits.”
man bash
Run Code Online (Sandbox Code Playgroud)
类似于man trapin that is 引用ERR但没有根据我所看到的来定义它。
捷径背后的实际信号是什么ERR?(在正常信号中,如 中所示man 7 signal)。
我更喜欢捕获实际的信号名称而不是速记版本,尽管我意识到它们会产生相同的结果(从脚本中的命令捕获任何错误,然后抛出到处理程序)。
在我的Bash脚本中,我想确保一旦出现错误就退出脚本.(例如,为了避免rm -f *在失败后出错cd some_directory.)因此,我总是使用-ebash 的标志.
现在,我想也喜欢我的一些脚本来执行一些清理代码.从这篇博文中我收集到了
#!/bin/bash
cd invalid_directory
echo ':('
function clean_up {
echo "> clean_up"
exit 0
}
trap clean_up EXIT
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
./test.sh: line 3: cd: invalid_directory: No such file or directory
:(
> clean_up
Run Code Online (Sandbox Code Playgroud)
所以它做了广告宣传.但是,当-e用于bash时,我只会得到
./test.sh: line 3: cd: invalid_directory: No such file or directory
Run Code Online (Sandbox Code Playgroud)
所以脚本退出而不调用clean_up.
如何在所有错误中退出bash脚本并每次调用清理脚本?
在终端中手动逐行运行命令时,以下工作正常:
docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test
Run Code Online (Sandbox Code Playgroud)
但是当我将其作为 shell 脚本运行时,Docker 容器既没有停止也没有删除。
#!/usr/bin/env bash
set -e
docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它在 shell 脚本中工作?