ฉันสามารถเพิ่ม“ && 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.