ฉันสามารถเพิ่ม“ && prog2” ลงใน prog1 ที่รันอยู่แล้วได้หรือไม่?


87

เชลล์ส่วนใหญ่มีฟังก์ชั่นเช่น&&และ;เชื่อมโยงการดำเนินการของคำสั่งด้วยวิธีการบางอย่าง แต่จะเกิดอะไรขึ้นถ้าคำสั่งกำลังทำงานอยู่ฉันยังคงสามารถเพิ่มคำสั่งอื่นที่จะดำเนินการได้หรือไม่ขึ้นอยู่กับผลลัพธ์ของคำสั่งแรก

พูดว่าฉันวิ่ง

$ /bin/myprog
some output...

/bin/myprog && /usr/bin/mycleanupแต่ผมอยาก ฉันไม่สามารถฆ่าmyprogและรีสตาร์ททุกสิ่งได้เพราะเวลามากเกินไปจะหายไป ฉันสามารถCtrl+ Zมันและfg/ bgถ้าจำเป็น สิ่งนี้ทำให้ฉันสามารถโยงในคำสั่งอื่นได้หรือไม่

ฉันสนใจทุบตีเป็นส่วนใหญ่ แต่ยินดีต้อนรับคำตอบสำหรับกระสุนทั่วไปทุกตัว!

คำตอบ:


118

คุณควรทำสิ่งนี้ได้ในเชลล์ตัวเดียวกับที่คุณใช้waitคำสั่ง:

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

ตัดตอนมาจากหน้าคนทุบตี

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

รอคำสั่งควรทำงาน
BillThor

มีจำนวนของรูปแบบสั้นสำหรับการป้อน PID ของกระบวนการ backgrounded เช่น%, และ%1 $!สิ่งสำคัญคือต้องระบุ PID มิฉะนั้นคำสั่งที่สองจะทำงานเสมอ
BillThor

@BillThor - คุณมีคุณสมบัติตอบหรือบอกฉันนี้?
slm

ฉันมีคุณสมบัติคำตอบ ที่ราบwaitจะล้มเหลวในการให้ผลลัพธ์ที่ต้องการ มันเป็นเรื่องธรรมดาที่จะใช้รูปแบบสั้น ๆ เพราะพวกเขามีแนวโน้มที่จะพิมพ์ผิดน้อยกว่า
BillThor

2
ให้ฉันเป็นคนแรกที่แสดงความยินดีกับคุณในตราสัญลักษณ์ใหม่ที่
สดใส

63

fgส่งคืนพร้อมโค้ดออกจากโปรแกรมที่ดำเนินการต่อ คุณสามารถระงับโปรแกรมของคุณด้วย^Zแล้วใช้fg && ...เพื่อดำเนินการต่อ

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

หากคุณระงับอีกครั้งก่อนที่มันจะจบลงและทำสิ่งเดียวกันด้วยคำสั่งที่แตกต่างกันการผูกมัดเริ่มต้นของ mycleanup จะถูกแทนที่หรือไม่?
Burhan Ali

3
@BurhanAli การระงับmyprogเป็นครั้งที่สองทำให้เกิดfgการยกเลิกด้วยรหัสทางออก 20 - ซึ่งไม่ใช่ศูนย์ดังนั้นmycleanupคำสั่งที่ถูกโยงจะไม่ถูกดำเนินการ
n.st

1

ไม่แน่ใจว่าสิ่งที่คุณต้องการเป็นไปได้หรือไม่ แต่ถ้าคุณยังมีเชลล์ที่คุณเริ่มต้นโปรแกรมคุณสามารถตรวจสอบ$?สถานะการออกของกระบวนการสุดท้ายได้เสมอ:

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

1
สิ่งนี้จะใช้งานได้ แต่เขาจะต้องเรียกใช้สิ่งนี้ด้วยตนเองหลังจากนั้นเขาต้องการเรียกใช้โดยอัตโนมัติเมื่อคำสั่งเสร็จสิ้น
slm

@slm เห็นด้วย ฉันไม่มีวิธีแก้ปัญหาที่แน่นอน
โจเซฟอาร์

3
ตรวจสอบwaitคำสั่งใน Bash
slm

1

หากงานอยู่ในเบื้องหน้าคำสั่งอย่างใดอย่างหนึ่งเหล่านี้จะมีลักษณะการทำงานแบบเดียวกับที่คุณคาดไว้

[ $? -eq 0 ] && prog2
(( $? )) || prog2

หมายเหตุ: $? จะมีสถานะการส่งคืนของโปรแกรมที่กำลังทำงานเมื่อออกจากโปรแกรม

นี่เป็นการระบุว่าเชลล์จะทำอย่างไรถ้าคุณได้ป้อนคำสั่งในตอนแรก

prog1 && prog2

หากคำสั่งแรกไม่อ่านจากstdinและกำลังทำงานในเบื้องหน้าคำสั่งใหม่สามารถป้อนได้ในขณะที่คำสั่งแรกกำลังทำงาน เชลล์จะอ่านและดำเนินการเมื่อคำสั่งแรกดำเนินการ stdinหากคำสั่งจะทำงานในพื้นหลังเป็นไปได้ยากก็คือการอ่าน

แก้ไข: การวางงานในพื้นหลังและการใช้WAITคำสั่งสามารถใช้ สิ่งนี้จะต้องดำเนินการด้วยความระมัดระวังหากมีการเรียกใช้งานอื่นในพื้นหลัง ต้องการข้อมูลจำเพาะงานเพื่อให้WAITคำสั่งส่งคืนสถานะของงานที่รออยู่


สิ่งนี้จะใช้งานได้ แต่เขาจะต้องเรียกใช้สิ่งนี้ด้วยตนเองหลังจากนั้นเขาต้องการเรียกใช้โดยอัตโนมัติเมื่อคำสั่งเสร็จสิ้น
slm

4
@slm ตราบใดที่คำสั่งไม่อ่าน stdin คำสั่งใหม่สามารถป้อนได้ในขณะที่คำสั่งแรกกำลังทำงาน เชลล์จะอ่านทันทีที่คำสั่งแรกเสร็จสิ้น
BillThor

หากเขาทำอะไรในเปลือกหลังจากผ่านพื้นหลังไปแล้วมันน่าจะถูกซ่อนไว้ อย่างน้อยตาม prelim การทดสอบฉันทำมาแล้ว!
slm

2
@BillThor ฉันคิดว่าคุณควรเพิ่มความคิดเห็นนั้นในคำตอบของคุณ
โจเซฟอาร์

2
ใช่การใช้waitไม่เหมาะเช่นกัน ข้อดีของ IMO คือมันทำให้เรามี API ที่ชัดเจนยิ่งขึ้นซึ่งเรากำลังเผชิญอยู่ พิมพ์คำสั่งเพิ่มเติมในบรรทัดคำสั่งหลังจากที่บางสิ่งบางอย่างทำงานดูเหมือนว่าฉันจะแฮ็คเล็กน้อย waitยังคงทุกข์ทรมานจากการไม่ได้รับลิงก์โดยตรงไปยัง PID ที่กำลังทำงานอยู่, wrt สถานะการส่งคืน นี้ดูเหมือนว่าจะเป็นปัญหามากขึ้น w / วิธีการดำเนินการทุบตีสิ่งแม้ว่า: stackoverflow.com/questions/356100/... ดังนั้นนี่อาจจะดีเท่าที่ได้รับ
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.