为什么在尝试捕获 SIGINT 信号时会收到错误消息?

为什么在尝试捕获 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 mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit
fi

答案1

去掉SIG前缀,只需输入信号名称:

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

并非所有 shell 都能理解/接受带有前缀的输入SIGsh(假设您正在使用dash) 就是其中之一。

另一方面,功能更丰富的 shell 如ksh, bash,zsh允许SIG在信号名称前面添加前缀。

相关内容