คำถามติดแท็ก trap

3
“ กับดัก…ออกจากระยะเวลา” จำเป็นจริงๆหรือ?
ตัวอย่างมากมายสำหรับtrapใช้trap ... INT TERM EXITสำหรับงานการล้างข้อมูล แต่มันจำเป็นจริงๆหรือไม่ที่จะแสดงรายการทั้งสาม sigspecs? คู่มือบอกว่า: หาก SIGNAL_SPEC เป็น EXIT (0) ARG จะถูกดำเนินการเมื่อออกจากเปลือก ซึ่งผมเชื่อว่าไม่ว่าจะใช้สคริปต์เสร็จได้ตามปกติหรือมันเสร็จเพราะมันได้รับหรือSIGINT SIGTERMการทดลองยืนยันความเชื่อของฉันด้วย: $ cat ./trap-exit #!/bin/bash trap 'echo TRAP' EXIT sleep 3 $ ./trap-exit & sleep 1; kill -INT %1 [1] 759 TRAP [1]+ Interrupt ./trap-exit $ ./trap-exit & sleep 1; kill -TERM %1 [1] …
63 bash  shell  signals  trap 


6
Trap, ERR และ echoing บรรทัดข้อผิดพลาด
ฉันกำลังพยายามสร้างการรายงานข้อผิดพลาดโดยใช้ Trap เพื่อเรียกใช้ฟังก์ชันกับข้อผิดพลาดทั้งหมด: Trap "_func" ERR เป็นไปได้ไหมที่จะรับสัญญาณ ERR ที่เป็นเส้นตรง? เปลือกเป็นทุบตี หากฉันทำเช่นนั้นฉันสามารถอ่านและรายงานคำสั่งที่ใช้และบันทึก / ดำเนินการบางอย่าง หรือบางทีฉันอาจจะทำผิดทั้งหมดนี้? ฉันทดสอบกับสิ่งต่อไปนี้: #!/bin/bash trap "ECHO $LINENO" ERR echo hello | grep "asdf" และ$LINENOกำลังกลับมา 2 ไม่ทำงาน

2
พฤติกรรมที่ถูกต้องของกับดัก EXIT และ ERR เมื่อใช้ `set -eu`
ฉันสังเกตเห็นพฤติกรรมแปลก ๆ บางอย่างเมื่อใช้set -e( errexit), set -u( nounset) พร้อมกับดัก ERR และ EXIT ดูเหมือนว่าพวกเขาเกี่ยวข้องกันดังนั้นการใส่คำถามเหล่านั้นลงในคำถามเดียวก็สมเหตุสมผล 1) set -uไม่เรียกใช้กับดัก ERR รหัส: #!/bin/bash trap 'echo "ERR (rc: $?)"' ERR set -u echo ${UNSET_VAR} คาดว่า: มีการเรียกใช้กับดัก ERR, RC! = 0 จริง: ไม่ได้เรียกกับแทร็บ ERR , RC == 1 หมายเหตุ: set -eไม่เปลี่ยนผลลัพธ์ 2) การใช้set -euรหัสออกในกับดักของ EXIT คือ …

1
รอ bash-builtin เบิร์น CPU ที่ 100 เปอร์เซ็นต์
เกิดขึ้นอย่างน้อยในGNU bash รุ่น 4.3.42 x86_64 && GNU bash รุ่น 4.3.11 x86_64 ฉันใช้sleep & wait $!แทนวิธีง่าย ๆsleepในการทำให้sleepสัญญาณขัดจังหวะ(เหมือนSIGUSR1 ) แต่ดูเหมือนว่าwaitbash-builtin จะทำงานในลักษณะที่แปลกเมื่อคุณเรียกใช้สิ่งต่อไปนี้ อาคาร 1: cat <( trap 'echo SIGUSR1' SIGUSR1; echo $BASHPID; while :;do sleep 1 & wait $!; echo test; done )& อาคาร 2: kill -10 /the pid of the subshell, printed …

3
กับดักได้รับมรดกโดย subshell หรือไม่
ฉันลองใช้สคริปต์ต่อไปนี้: #!/bin/bash trap 'echo "touching a file" && touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo ผลลัพธ์สำหรับสคริปต์ข้างต้นคือ: [root@usr1 my_tests]# ./test.sh foo1 foo touching a file อย่างไรก็ตามฉันคาดหวังว่ากับดักจะถูกเรียกเมื่อออกจากfoo1เช่นกันซึ่งเรียกว่าใน subshell คาดหวังหรือไม่ มีการtrapสืบทอดโดย subshell หรือไม่ ถ้าใช่แล้วในกรณีใดที่trapสืบทอดโดย subshell?
14 shell  trap  subshell 

4
เก็บรหัสทางออกเมื่อวางกับ SIGINT และคล้ายกันหรือไม่
หากฉันใช้trapเช่นอธิบายไว้ในhttp://linuxcommand.org/wss0160.php#trapเพื่อจับ ctrl-c (หรือคล้ายกัน) และการล้างข้อมูลก่อนออกจากนั้นฉันจะเปลี่ยนรหัสออกที่ส่งคืน ตอนนี้อาจจะไม่สร้างความแตกต่างในโลกแห่งความเป็นจริง (เช่นเพราะรหัสออกไม่ได้พกพาและด้านบนของที่ไม่โปร่งใสตลอดเวลาตามที่กล่าวไว้ในรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? ) แต่ฉันสงสัยว่ามี จริงๆแล้วไม่มีวิธีในการป้องกันและส่งคืนรหัสข้อผิดพลาดเริ่มต้นสำหรับสคริปต์ที่ถูกขัดจังหวะแทนหรือไม่ ตัวอย่าง (เป็น bash แต่คำถามของฉันไม่ควรพิจารณาเฉพาะ bash): #!/bin/bash trap 'echo EXIT;' EXIT read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _ trap 'echo SIGINT; exit 1;' INT read -p 'If you ctrl-c me now …

2
วิธีการทริกเกอร์ข้อผิดพลาดโดยใช้คำสั่ง Trap
ฉันใช้ Ubuntu 12.04.2 ฉันพยายามใช้คำสั่ง "trap" เพื่อจับภาพผิดปกติหรือข้อผิดพลาดในเชลล์สคริปต์ของฉัน แต่ฉันยังพยายามที่จะออกจาก "Error" ด้วยตนเอง ฉันลองใช้ทางออก 1 แล้ว แต่จะไม่ส่งสัญญาณ "ข้อผิดพลาด" #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func ไม่แน่ใจว่าจะเรียกสัญญาณออก "ผิดพลาด" ด้วยตนเองได้อย่างไร

3
วิธีการตั้งค่ากับดักในฟังก์ชั่นทุบตี?
ฉันสามารถตั้งค่าtrapในสคริปต์ทุบตี แต่ไม่ใช้ฟังก์ชันทุบตี ตัวอย่างเช่นsourceรหัสด้านล่างและเรียกใช้fตอนนี้ลองCtrl+ Cมันไม่ถูกดักจับ! วิธีการตั้งค่าtrapในฟังก์ชั่นทุบตี? 4 trap ctrl_c INT 5 6 ctrl_c () { 7 echo "** Trapped CTRL-C" 8 } 9 10 11 f () { 12 for i in `seq 1 100`; do 13 sleep 1 14 echo -n "." 15 done 16 }
13 bash  trap 

1
เหตุใดฉันจึงได้รับข้อความแสดงข้อผิดพลาดเมื่อพยายามดักจับสัญญาณ SIGINT
ฉันใช้งานสคริปต์ด้านล่างเพื่อดาวน์โหลดไฟล์จากเซิร์ฟเวอร์โดยอัตโนมัติโดยใช้ 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 …
12 shell  trap 

6
เริ่มงานเงียบ ๆ ในเบื้องหลัง
ฉันรู้ว่าคุณสามารถใช้สิ่งนี้เพื่อเริ่มต้นกระบวนการในพื้นหลังโดยไม่ได้รับการแจ้งเตือนเมื่อกระบวนการถูกวางไว้ในพื้นหลังและเมื่อมันทำเช่นนั้น: (คำสั่ง &) &> / dev / null อย่างไรก็ตามสิ่งนี้จะลบตัวเลือกเพื่อดักจับเมื่อกระบวนการเสร็จสิ้น ( trap child_done CHLD) ฉันจะมีทั้งคู่ได้อย่างไร
12 process  zsh  trap 

3
สัญญาณ 0 ในคำสั่ง Trap คืออะไร?
ฉันทำตามคำแนะนำนี้เกี่ยวกับวิธีการตั้งค่าการรับรองความถูกต้อง SSH แบบไม่มีรหัสผ่านกับ ssh-agent ในการเริ่มต้น ssh-agent ผู้เขียนแนะนำรหัสต่อไปนี้ใน.bash_profile: SSHAGENT=/usr/bin/ssh-agent SSHAGENTARGS="-s" if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then eval `$SSHAGENT $SSHAGENTARGS` trap "kill $SSH_AGENT_PID" 0 fi ฉันไม่เข้าใจว่าทำไมมันถึงเป็นกับดักสัญญาณ 0 ตามสัญญาณของมนุษย์ 7ไม่มีสัญญาณดังกล่าว นี่เป็นเพียงการพิมพ์ผิดหรือข้อผิดพลาดหรือทำสิ่งนี้สำเร็จหรือไม่
12 bash  signals  trap 

1
การดักจับและ subshells โดยนัยในเชลล์สคริปต์
สมมติว่าคุณมีเชลล์สคริปต์ที่รันโค้ดการล้างข้อมูลบางประเภทผ่านEXITกับดักเช่นนี้: #!/bin/bash mytrap () { echo "It's a trap!" >&2 } trap mytrap exit echo I am at the end of the script. สิ่งนี้จะพิมพ์ออกมาIt's a trap!เมื่อสคริปต์ออก: $ sh myscript I am at the end of the script. It's a trap! คุณปรับเปลี่ยนสคริปต์เพื่อเพิ่มฟังก์ชั่นที่สร้างผลลัพธ์บางอย่างที่ได้รับการไพพ์ไปยังคำสั่งอื่นในท้ายที่สุดดังนี้: #!/bin/bash mytrap () { echo "It's a trap!" >&2 …
12 shell  trap 

3
แทร็บ 'Ctrl + c' สำหรับสคริปต์ทุบตี แต่ไม่เปิดสำหรับกระบวนการในสคริปต์นี้
ฉันพยายามที่จะมีโปรแกรมแบบโต้ตอบในสคริปต์ทุบตี: my_program และฉันต้องการปิดด้วย 'Ctrl + c' แต่เมื่อฉันทำมันสคริปต์ของฉันก็ปิดเช่นกัน ฉันรู้เกี่ยวกับ trap '' 2 my_program trap 2 แต่ในกรณีนี้ฉันไม่สามารถปิดmy_programด้วย Ctrl + c คุณมีความคิดวิธีการอนุญาตให้ Ctrl + c ในโปรแกรม แต่ไม่ปิดสคริปต์ทำงานหรือไม่ แก้ไข: เพิ่มตัวอย่าง #!/bin/bash my_program my_program2 ถ้าฉันใช้ Ctrl + C เพื่อใกล้my_program, my_program2ไม่เคยดำเนินการเพราะสคริปต์ทั้งหมดจะออก
11 bash  trap 

2
ฉันจะดักโปรแกรมที่คืนค่า 139 (การแบ่งเซกเมนต์ผิดพลาด) ใน bash ได้อย่างไร?
ฉันมีสคริปต์ทุบตีที่ทดสอบโปรแกรมบางโปรแกรมและหนึ่งในโปรแกรมส่งคืนSegmentation faultดังนั้นฉันจึงพยายามเพิ่มกับดักไว้ในหัวสคริปต์ของฉัน: trap "echo 'segfault occured!'" SIGSEGV อย่างไรก็ตามไม่ได้ทำอะไรเลย ฉันใช้ echo $? หลังจากโปรแกรมที่สร้าง segfault และฉันได้รับ139เป็นผลลัพธ์ ฉันจะเพิ่มกับดักสำหรับรหัสข้อผิดพลาดเฉพาะนั้นได้อย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.