Por que recebo uma mensagem de erro ao tentar interceptar um sinal SIGINT?


12

Estou executando o script abaixo para baixar automaticamente arquivos de um servidor usando lftp. Funciona exceto que, quando executado, recebo a mensagem de erro

trap: SIGINT: bad trap

Se eu substituir SIGINT e SIGTERM por INT e TERM, funcionará, mas não sei se alcançará o mesmo objetivo. Isso está no 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
Em que usuário esse código é executado? O que acontece se alguém malcriado cria ln -s /etc/passwd /tmp/$base_name.lockou equivalente?
thrig

Respostas:


16

Solte o SIGprefixo, apenas insira o nome do sinal:

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

Nem todos os shells entendem / aceitam a entrada com o SIGprefixo sh(presumivelmente você está usando dash) é um deles.

Por outro lado, mais possuem conchas ricos como ksh, bash, zshpermitem SIGprefixo na frente do nome do sinal.


Obrigado! foi isso que tentei; Eu só queria ter certeza de que fazia a mesma coisa.
flyingace 5/10

@flyingace você também pode mudar sua #!linha para referência em bashvez de sh.
roaima 05/10

Usando dash, hein? Eu nunca ouvi falar dessa concha antes ...
SeldomNeedy 28/02/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.