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


12

以下のスクリプトを実行して、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

1
このコードはどのユーザーとして実行されますか?いたずらな人が作成ln -s /etc/passwd /tmp/$base_name.lockまたは同等の場合はどうなりますか?
-thrig

回答:


16

ドロップSIGプレフィックスを、単に入力信号名:

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

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

一方、より多くの機能が豊富な貝が好きkshbashzsh許可SIG信号名の前に接頭辞を。


ありがとうございました!それが私が試したものです。同じことを確認したかっただけです。
flyingace

@flyingace では、#!行をのbash代わりに参照に変更することも検討できますsh
ロアイマ

を使用してdash?私は前にそのシェルについて聞いたことがありません
...-SeldomNeedy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.