เหตุใดฉันจึงได้รับข้อความแสดงข้อผิดพลาดเมื่อพยายามดักจับสัญญาณ 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 คุณยังสามารถพิจารณาเปลี่ยนคุณ#!เส้นด้านซ้ายไปอ้างอิงแทนbash sh
roaima

ใช้dashเหรอ? ฉันไม่เคยได้ยินเรื่องของเปลือกหอยมาก่อน ...
SeldomNeedy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.