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)는 그 중 하나입니다.

같은 반면에, 더 풍부한 껍질을 특징으로 ksh, bash, zsh수 있도록 SIG신호 이름 앞에 접두사.


감사합니다! 그것이 제가 시도한 것입니다. 나는 그것이 똑같은 일을했는지 ​​확인하고 싶었다.
flyingace

@flyingace 당신은 또한 대신에 #!참조로 라인을 변경하는 것을 고려할 수 있습니다 . bashsh
roaima

을 사용 dash합니까? 나는 전에 그 껍질에 대해 들어 본 적이
없어요
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.