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

16
รับสถานะทางออกของกระบวนการที่ถูกส่งไปยังกระบวนการอื่น
ฉันมีสองกระบวนการfooและbarเชื่อมต่อกับท่อ: $ foo | bar barออกจาก 0 เสมอ fooฉันสนใจในรหัสทางออกของ มีวิธีใดบ้างที่จะไปถึงที่นั่น?
287 shell  pipe  exit 

4
ฉันสามารถเพิ่ม“ && prog2” ลงใน prog1 ที่รันอยู่แล้วได้หรือไม่?
เชลล์ส่วนใหญ่มีฟังก์ชั่นเช่น&&และ;เชื่อมโยงการดำเนินการของคำสั่งด้วยวิธีการบางอย่าง แต่จะเกิดอะไรขึ้นถ้าคำสั่งกำลังทำงานอยู่ฉันยังคงสามารถเพิ่มคำสั่งอื่นที่จะดำเนินการได้หรือไม่ขึ้นอยู่กับผลลัพธ์ของคำสั่งแรก พูดว่าฉันวิ่ง $ /bin/myprog some output... /bin/myprog && /usr/bin/mycleanupแต่ผมอยาก ฉันไม่สามารถฆ่าmyprogและรีสตาร์ททุกสิ่งได้เพราะเวลามากเกินไปจะหายไป ฉันสามารถCtrl+ Zมันและfg/ bgถ้าจำเป็น สิ่งนี้ทำให้ฉันสามารถโยงในคำสั่งอื่นได้หรือไม่ ฉันสนใจทุบตีเป็นส่วนใหญ่ แต่ยินดีต้อนรับคำตอบสำหรับกระสุนทั่วไปทุกตัว!
87 bash  shell  process  exit 

4
รหัสการออกเริ่มต้นเมื่อกระบวนการยุติลง?
เมื่อกระบวนการถูกฆ่าด้วยสัญญาณที่จับได้เช่นSIGINTหรือSIGTERMแต่ไม่จัดการสัญญาณสิ่งที่จะเป็นรหัสทางออกของกระบวนการ? สิ่งที่เกี่ยวกับสัญญาณที่SIGKILLไม่สามารถจัดการได้เป็นอย่างไร จากสิ่งที่ผมสามารถบอกได้ฆ่ากระบวนการที่มีSIGINTผลแนวโน้มในรหัสทางออก130แต่ที่แตกต่างกันโดย kernel หรือการดำเนินเปลือก? $ cat myScript #!/bin/bash sleep 5 $ ./myScript <ctrl-c here> $ echo $? 130 ฉันไม่แน่ใจว่าฉันจะทดสอบสัญญาณอื่น ๆ ได้อย่างไร ... $ ./myScript & $ killall myScript $ echo $? 0 # duh, that's the exit code of killall $ killall -9 myScript $ echo $? 0 # …

4
ทำไม (ทางออก 1) ไม่ออกจากสคริปต์
ฉันมีสคริปต์ที่ไม่ได้ออกเมื่อฉันต้องการมัน ตัวอย่างสคริปต์ที่มีข้อผิดพลาดเดียวกันคือ: #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' ฉันคิดว่าจะเห็นผลลัพธ์: :~$ ./test.sh 1 :~$ แต่ฉันเห็นจริง: :~$ ./test.sh 1 2 :~$ ที่ไม่()สั่งการผูกมัดใดสร้างขอบเขตหรือไม่? เกิดอะไรขึ้นexitถ้าไม่ใช่สคริปต์?

1
มีคำสั่งมาตรฐานที่มักจะออกมาพร้อมกับความล้มเหลวหรือไม่?
ฉันต้องการทดสอบสคริปต์ด้วยคำสั่งที่ล้มเหลว ฉันสามารถใช้คำสั่งที่มีอยู่ด้วยข้อโต้แย้งที่ไม่ดี ฉันยังสามารถเขียนสคริปต์ง่าย ๆ ที่ออกโดยทันทีด้วยความล้มเหลว ทั้งสองอย่างนี้ทำได้ง่ายและทำงานให้ฉัน แต่ถ้ามีคำสั่งมาตรฐานสำหรับวัตถุประสงค์นี้ฉันต้องการใช้สิ่งนั้นแทน

4
มีตัวแปร UNIX ใดบ้างที่กระบวนการลูกตายกับผู้ปกครอง?
ฉันได้ศึกษาพฤติกรรมเคอร์เนลของ Linux มาระยะหนึ่งแล้วและมันชัดเจนสำหรับฉันเสมอว่า: เมื่อกระบวนการตายเด็กทุกคนจะถูกส่งกลับไปที่initกระบวนการ (PID 1) จนกว่าพวกเขาจะตายในที่สุด อย่างไรก็ตามเมื่อเร็ว ๆ นี้มีคนที่มีประสบการณ์มากกว่าฉันด้วยเคอร์เนลบอกฉันว่า: เมื่อกระบวนการออกไปเด็กทุกคนในนั้นก็ตาย (ยกเว้นคุณใช้NOHUPในกรณีที่พวกเขากลับไปinit) ตอนนี้แม้ว่าฉันจะไม่เชื่อเรื่องนี้ฉันยังคงเขียนโปรแกรมง่าย ๆ เพื่อให้แน่ใจ ฉันรู้ว่าฉันไม่ควรพึ่งพาเวลา ( sleep) สำหรับการทดสอบเนื่องจากทุกอย่างขึ้นอยู่กับการจัดตารางกระบวนการ แต่สำหรับกรณีง่าย ๆ นี้ฉันคิดว่ามันค่อนข้างเพียงพอ int main(void){ printf("Father process spawned (%d).\n", getpid()); sleep(5); if(fork() == 0){ printf("Child process spawned (%d => %d).\n", getppid(), getpid()); sleep(15); printf("Child process exiting (%d => %d).\n", getppid(), getpid()); …
41 process  init  exit  fork 

6
ออกจากเชลล์สคริปต์จากเชลล์ย่อย
ลองพิจารณาตัวอย่างนี้: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } โดยปกติเมื่อfuncถูกเรียกมันจะทำให้สคริปต์หยุดทำงานซึ่งเป็นพฤติกรรมที่ตั้งใจไว้ อย่างไรก็ตามถ้ามันถูกดำเนินการใน sub-shell เช่น in result=`func` มันจะไม่ออกจากสคริปต์ ซึ่งหมายความว่ารหัสการโทรต้องตรวจสอบสถานะการออกของฟังก์ชั่นทุกครั้ง มีวิธีหลีกเลี่ยงสิ่งนี้หรือไม่? สิ่งนี้set -eมีไว้เพื่ออะไร?

5
ป้องกัน grep ไม่ให้ออกในกรณีที่มีการระบุชื่อ
สคริปต์นี้ไม่ได้สะท้อน "หลัง": #!/bin/bash -e echo "before" echo "anything" | grep e # it would if I searched for 'y' instead echo "after" exit และถ้าฉันลบ-eตัวเลือกในบรรทัด shebang ออก แต่ฉันต้องการเก็บไว้เพื่อให้สคริปต์ของฉันหยุดทำงานหากมีข้อผิดพลาด ฉันไม่คิดว่า grep ไม่พบการจับคู่เป็นข้อผิดพลาด ฉันจะป้องกันไม่ให้ออกโดยทันทีได้อย่างไร


3
ฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในชั้นย่อย
ฉันพยายามเขียนฟังก์ชั่นเพื่อแทนที่ฟังก์ชั่นการทำงานของexitbuiltin เพื่อป้องกันตัวเองไม่ให้ออกจากเครื่อง ฉันพยายามใช้SHLVLตัวแปรสภาพแวดล้อม แต่ดูเหมือนจะไม่เปลี่ยนแปลงภายใน subshells: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 ฟังก์ชั่นของฉันเป็นดังนี้: exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } สิ่งนี้จะไม่อนุญาตให้ฉันใช้exitภายใน subshells แม้ว่า: $ exit Nice try! $ …
24 bash  shell  exit  subshell 

4
กระบวนการหลักใหม่เมื่อกระบวนการหลักตาย
ใน UNIX เมื่อกระบวนการผู้ปกครองหายไปฉันคิดว่ากระบวนการลูกทั้งหมดรีเซ็ตการเริ่มต้นเป็นผู้ปกครอง สิ่งนี้ไม่ถูกต้องตลอดเวลาหรือไม่ มีข้อยกเว้นใด ๆ
22 process  init  exit 

2
รหัสจบการทำงานท้ายสคริปต์ทุบตี
ฉันสับสนเกี่ยวกับความหมายของรหัสออกในตอนท้ายของสคริปต์ทุบตี: ฉันรู้ว่ารหัสออก 0 หมายความว่าเสร็จสมบูรณ์และมีหมายเลขรหัสทางออกอื่นอีกมากมาย (127 ถ้าฉันไม่เข้าใจผิด?) คำถามของฉันเกี่ยวกับเมื่อเห็นรหัสออก 0 ที่ท้ายสคริปต์มันบังคับให้รหัสออกเป็น 0 แม้ว่าสคริปต์จะล้มเหลวหรือมีความหมายอื่นหรือไม่

4
bash -e ออกเมื่อให้หรือ expr ประเมินเป็น 0
ฉันมี bash script ที่ตั้งค่า -e ดังนั้นสคริปต์จะออกจากสถานะการออกใด ๆ ! = 0 ฉันพยายามทำเลขคณิตพื้นฐานของเชลล์ที่กำหนดให้กับตัวแปรและบางครั้งนิพจน์มีค่าเท่ากับ 0 ซึ่งทำให้สถานะการออกของคำสั่ง let หรือ expr เป็น "1" นี่คือตัวอย่าง: #!/bin/bash -ex echo "Test 1" Z=`expr 1 - 1` || true echo "Z will print" let "A=4 - 4" echo "A WILL NEVER PRINT $A" Y=`expr 1 - 1` echo "Y …

7
ออกจากการเชื่อมต่อ SSH ทั้งหมดในหนึ่งคำสั่งและปิด PuTTY
มีวิธีในการสำรองการเชื่อมต่อ SSH ทั้งหมดและปิดPuTTYใน "one shot" หรือไม่ ฉันทำงานใน Windows 7 และใช้ PuTTY กับ SSH ไปยังโฮสต์ Linux ต่างๆ ตัวอย่างของวิธีที่ฉันพบว่าตัวเองทำงาน: SSH to host1 with PuTTY... banjer@host1:~> #...doin some work...ooh! need to go check something on host8... banjer@host1:~> ssh host8 banjer@host8:~> #...doin some work...OK time for lunch. lets close putty... banjer@host8:~> exit banjer@host1:~> exit …
19 linux  ssh  windows  putty  exit 

4
ฉันจะรับรายการรหัสทางออก (และ / หรือรหัสส่งคืน) และความหมายสำหรับคำสั่ง / ยูทิลิตี้ได้อย่างไร
มีวิธีที่ฉันสามารถทำสิ่งที่ระบุไว้ในชื่อเรื่องจากคำสั่ง terminal หรือฉันจะต้องมองเข้าไปในรหัส?

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