Pourquoi est-ce que j'obtiens un message d'erreur lorsque j'essaie d'intercepter un signal SIGINT?

12

J'exécute le script ci-dessous pour télécharger automatiquement des fichiers à partir d'un serveur à l'aide de lftp. Cela fonctionne sauf que quand il s'exécute, j'obtiens le message d'erreur

trap: SIGINT: bad trap

Si je remplace SIGINT et SIGTERM par INT et TERM, cela fonctionne, mais je ne sais pas s'il atteint le même objectif. C'est sur 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
flyingace
la source
1
Sous quel utilisateur ce code s'exécute-t-il? Que se passe-t-il si quelqu'un de méchant crée ln -s /etc/passwd /tmp/$base_name.lockou équivalent?
thrig

Réponses:

16

Déposez le SIGpréfixe, entrez simplement le nom du signal:

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

Tous les shells ne comprennent pas / n'acceptent pas l'entrée avec le SIGpréfixe sh(probablement vous utilisez dash) est l'un d'entre eux.

D'autre part, plus riches en vedette des coquilles comme ksh, bash, zshpermettent SIGpréfixe devant le nom du signal.

heemayl
la source
Je vous remercie! c'est ce que j'ai essayé; Je voulais juste m'assurer que ça faisait la même chose.
flyingace
@flyingace, vous pouvez également envisager #!de bashremplacer votre ligne par référence au lieu de sh.
roaima
Vous utilisez dash, hein? Je n'ai jamais entendu parler de cet obus avant ...
SeldomNeedy