尝试捕获SIGINT信号时为什么会出现错误消息?


12

我正在运行以下脚本,以使用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 mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit
fi

1
此代码以什么用户身份运行?如果一个顽皮的人创造ln -s /etc/passwd /tmp/$base_name.lock或等效的东西会怎样?
2016年

Answers:


16

删除SIG前缀,只需输入信号名称:

trap "rm -f -- "$lock_file"" INT TERM

并非所有的shell都理解/接受带有SIG前缀的输入,sh(大概是在使用dash)就是其中之一。

另一方面,更多功能丰富的外壳(如kshbashzsh允许SIG在信号名称前添加前缀。


谢谢!这就是我尝试过的;我只是想确保它做了同样的事情。
flyace 20年

@flyingace,您还可以考虑将#!行更改为引用bash而不是sh
roaima

使用dash,是吗?我之前
从没
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.