หนึ่งจะรันหลายโปรแกรมในพื้นหลังด้วยคำสั่งเดียวได้อย่างไร


36

หนึ่งจะรันหลายโปรแกรมในพื้นหลังด้วยคำสั่งเดียวได้อย่างไร

ฉันลองคำสั่งด้านล่างแล้ว แต่มันไม่ทำงาน

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

"คำสั่ง" เดียวคืออะไร? สายทุบตี?
Oluf Lorenzen


ฉันอาจจะขาดอะไรบางอย่างที่เห็นได้ชัด แต่ && หมายถึงการรู้รหัสทางออกของคำสั่งก่อนหน้า หากคุณแบ็กกราวน์มันจะไม่ทราบรหัสการออก ฟังก์ชั่นจำเป็นต้องมีอะไรบ้าง?
Richlv

คำตอบ:


32

จากมุมมองไวยากรณ์ของเชลล์&แยกคำสั่งเช่น;/ |/ &&... (แม้ว่าจะมีความหมายต่างกัน) ดังนั้นมันเป็นเพียง:

cmd1 & cmd2 & cmd3 &

1
นี่ไม่ใช่ / ค่อนข้าง / ขวา;เริ่มคำสั่งถัดไปทันทีที่คำสั่งแรกจบลง &จริงทำให้คำสั่งกับพื้นหลัง ลองใช้วิธีนี้:echo foo & echo bar & echo test &
Oluf Lorenzen

1
@Finkregh แน่นอน ไม่มีใครสงสัยเลยว่า ฉันแค่หมายถึงพวกเขาทั้งสองแยกคำสั่ง (จากมุมมองไวยากรณ์) โดยไม่เกี่ยวข้องกับวิธีที่พวกเขาทำงาน
Stéphane Chazelas

มันไม่ได้เป็นสิ่งที่ถูกถามเนื่องจากคำถามที่ระบุออกคำสั่ง "คำสั่งเดียว" ไม่ใช่คำตอบของฉันเพราะมันเป็นชุดของคำสั่ง แต่ก็มีอย่างน้อยหนึ่งความหมายของคำสั่งเดียวในผลลัพธ์ที่ถูกต่อกันสามารถเปลี่ยนเส้นทางได้ ฯลฯ
Eli Heady

"คำสั่งหลายคำสั่งด้วยคำสั่งเดียว" ดูเหมือนว่าจะเป็นแบบโอเปร่า - นั่นหมายความว่าอย่างไร? หากนี่เป็นสิ่งที่sudoคุณต้องการเพื่อให้คุณสามารถป้อนรหัสผ่านได้เพียงครั้งเดียวให้ห่อbash -cหรือใส่รหัสที่คล้ายกัน
Richlv

12

ส่วน bash manpage ที่ชื่อว่าCompound Commandsมีสองตัวเลือกที่สามารถใช้งานได้คำสั่ง list และ group

{}คำสั่งกลุ่มคือชุดของคำสั่งที่อยู่ในวงเล็บปีกกา ()รายการที่จะเหมือนกันในวงเล็บ ทั้งสองสามารถใช้เพื่อแบ็คกราวน์คำสั่งหลาย ๆ คำสั่งภายในและสุดท้ายจะแบ็คกราวด์คอลเล็กชันทั้งหมดเป็นชุด รายการสร้างเรียกใช้งานคำสั่งในเชลล์ย่อยดังนั้นการกำหนดตัวแปรจะไม่ถูกสงวนไว้

วิธีรันกลุ่มคำสั่ง:

{ command1 & command2 & } &

คุณยังสามารถดำเนินการคำสั่งของคุณในรายการ (subshell):

( command1 & command2 ) &

1
ไม่เป็นไร ฉันเพิ่มลิงค์ไปยังคู่มือ โปรดทราบว่า()ไวยากรณ์ของรายการดำเนินการคำสั่งที่ล้อมรอบใน subshell ดังนั้นตัวแปรจะไม่ถูกเก็บไว้ภายใน
Eli Heady

3

อีกทางหนึ่ง:

$(command1 &) && command2 & 

ไม่มันจะเรียกใช้คำสั่งแรกจากนั้นหลังจากเสร็จสิ้นก่อนจากนั้นก็จะเรียกใช้คำสั่งอื่น
Rahul Patil

คุณใช้&&ในคำถามของคุณมันหมายความว่าในช่วงแรกเรียกใช้คำสั่งแล้วถ้าประสบความสำเร็จในการเรียกใช้เรียกใช้ command.if ต่อไปถ้าคุณไม่พิจารณามันคุณสามารถเรียกใช้command1 & ; command2 & ;
PersianGulf

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