web-dev-qa-db-ja.com

SIGINTシグナルをトラップしようとするとエラーメッセージが表示されるのはなぜですか?

以下のスクリプトを実行して、lftpを使用してサーバーからファイルを自動的にダウンロードします。実行時にエラーメッセージが表示されることを除いて機能します

trap: SIGINT: bad trap

SIGINTとSIGTERMをINTとTERMに置き換えても機能しますが、同じ目的を達成できるかどうかはわかりません。これは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
12
flyingace

接頭辞SIGを削除し、信号名を入力するだけです。

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

すべてのシェルがSIG接頭辞を持つ入力を理解/取得するわけではありません。sh(おそらくdashを使用している)はその1つです。

一方、kshbashzshなどのより機能豊富なシェルでは、信号名の前にSIGプレフィックスを付けることができます。

16
heemayl