ฉันจะโยงคำสั่งบนคอนโซลได้อย่างไร


23

ในbashบางครั้งฉันต้องการเรียกใช้หลายคำสั่งในอนุกรมและไม่ต้องการรอให้เสร็จก่อนที่ฉันจะพิมพ์คำสั่งใหม่ ดังนั้นฉันจะทำสิ่งนี้:

cmd1; cmd2; cmd3

น่าเสียดายที่หนึ่งในคำสั่งอาจล้มเหลว ในกรณีนี้ฉันต้องการหยุด มีวิธีง่ายๆในการทำเช่นนี้หรือไม่ แต่ทำเพื่อที่ฉันจะเรียกใช้คำสั่งต่อไปหากคำสั่งก่อนหน้ามีรหัส 0 ออกเท่านั้น


นี่คือคำตอบที่ดีจาก Unix SE
NonlinearFruit

คำตอบ:


39

ใช้&&โอเปอเรเตอร์

cmd1 && cmd2 && cmd3

ใน shellscripting &&และ||โอเปอเรเตอร์ถูกจำลองหลังจากปรับใช้งานตัวดำเนินการเชิงตรรกะใน C &&หมายถึงตัวดำเนินการ AND และ||หมายถึง OR Unix เกี่ยวข้องกับ C อย่างแน่นหนาและใน C ตัวถูกดำเนินการตัวที่สองของตัวดำเนินการเชิงตรรกะไม่ได้รับการประเมินถ้าทราบผลลัพธ์จากตัวถูกดำเนินการแรก เช่น"false && x"นี้ใช้falseสำหรับการใด ๆxดังนั้นจึงไม่จำเป็นต้องประเมินผลx(โดยเฉพาะถ้าxเป็นการเรียกใช้ฟังก์ชัน); "true || x"เช่นเดียวกันกับ นี้จะเรียกว่าไฟฟ้าลัดวงจร-ความหมาย

และใน Unix มันเป็นแบบดั้งเดิมในการตีความค่าส่งคืนคำสั่งว่า "ความสำเร็จที่สมบูรณ์" ค่าความจริง: รหัสทางออก 0 หมายถึงtrue(สำเร็จ), ไม่ใช่ศูนย์false(ล้มเหลว) ดังนั้นเมื่อคำสั่งแรกในการcmd1 && cmd2ส่งกลับ"false"(สถานะทางออกที่ไม่ใช่ศูนย์ซึ่งบ่งชี้ความล้มเหลว) สถานะของคำสั่งผสมเป็นที่รู้จักกัน: ความล้มเหลว ดังนั้นการตีความโดยรวมของcmd1 && cmd2 อาจเป็น: "ดำเนินการcmd1และจากนั้นถ้ามันไม่ได้ล้มเหลวcmd2" สิ่งใดที่คุณต้องการในคำถามของคุณ

ในทำนองเดียวกันกับ OR: cmd1 || cmd2สามารถตีความได้ว่า "execute cmd1หรือถ้าล้มเหลวcmd2"


Protip:สำหรับกลุ่มที่ยาวขึ้น&&ลองใส่set -eสคริปต์ของคุณ มันเป็นพื้นเปลี่ยนแปลงอัฒภาค;เข้า&&กับคู่ของกรณีพิเศษ


1
+1 สำหรับการอธิบาย||
Alp

คุณสามารถเชื่อมโยงสิ่งที่สถานะของคำสั่งแรกได้หรือไม่ (สำเร็จหรือล้มเหลว)
Hugo Trentesaux

@HugoTrentesaux คุณหมายถึงอะไร? .. ผลความสำเร็จ / ล้มเหลวหรือA || Bเป็นเพียงเช่นเดียวกับ [ลัดวงจร] ตรรกะA หรือ B A || Bเป็นความสำเร็จเมื่อAเป็นความสำเร็จหรือเมื่อAเป็นความล้มเหลวแต่Bก็ประสบความสำเร็จ ; และA || Bเป็นความล้มเหลวเมื่อAเป็นความล้มเหลวและเป็นB failureในทำนองเดียวกันสำหรับ&&มันตามตรรกะและ
ulidtko

ในบริบทเชลล์ฉันจะดำเนินการ A และ B ได้อย่างไรไม่ว่า A จะล้มเหลวหรือไม่สำเร็จ
Hugo Trentesaux

1
@HugoTrentesaux นั่นคือสิ่งที่ธรรมดาธรรมดา;(หรือขึ้นบรรทัดใหม่) ทำตามค่าเริ่มต้น set -eจะเปลี่ยน;เป็น&&พูดคร่าวๆ set +e[ค่าเริ่มต้น] เปลี่ยนA; Bเป็นสิ่งที่คุณพูด: เรียกใช้Aแล้วเรียกใช้ไม่ว่าอะไรBก็ตาม
ulidtko

13

"การผูกมัดสั่งการจัดกลุ่มพวกมัน"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

pings ก็ต่อเมื่อไม่สำเร็จดำเนินการกลุ่มคำสั่งที่ถูกล่ามโซ่ในวงเล็บ

เรียน

รายการจะต้องถูกยกเลิกด้วย ";"

จะต้องมีช่องว่างระหว่างวงเล็บและคำสั่งจัดกลุ่ม!


6

เพียงแค่มี&&ผู้ประกอบการ ตัวอย่างเช่น

cmd1 && cmd2 && cmd3

หากคำสั่งใดคำสั่งหนึ่งล้มเหลว (ส่งคืนค่าการออกนอกเหนือจาก 0) คำสั่งอื่นจะไม่ทำงาน

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