อะไรคือความแตกต่างระหว่าง double-ampersand (&&) และ semicolon (;) ใน Linux Bash?


112

อะไรคือความแตกต่างระหว่างเครื่องหมายและอัฒภาคใน Linux Bash ?

ตัวอย่างเช่น,

$ command1 && command2

เทียบกับ

$ command1; command2

6
ฉันตอบสิ่งนี้ที่นี่: superuser.com/a/619019/107862
Etan Reisner

9
เกี่ยวกับเรื่องนอกประเด็นครั้งที่แล้วฉันตรวจสอบ bash ยังคงเป็นภาษาโปรแกรม แต่ก่อนหน้านี้ฉันคิดผิดและอาจเป็นขนมผลไม้แห้ง
Steve K

คุณเคยถามคำถามเกี่ยวกับพฤติกรรมที่เฉพาะเจาะจงหรือวิธีที่ถูกต้องในการทำสิ่งหนึ่งสิ่งนั้นแน่นอน สิ่งนี้จัดอยู่ในหมวดหมู่ "คำถามเกี่ยวกับไวยากรณ์ของภาษา" ที่เป็นสีเทากว่าซึ่งไม่ชัดเจนเท่ากับคำถาม "การเขียนโปรแกรม" เท่าที่ฉันกังวล
Etan Reisner

4
การทุบในบางวิธีแห้งและบางวิธีก็หวาน ในตอนท้ายของวันมันค่อนข้างน่าพอใจและย่อยได้ อย่างไรก็ตามไม่สามารถขโมยได้ง่ายจากเด็กทารก
code_monk

คำตอบ:


139

ตัว&&ดำเนินการเป็นตัวดำเนินการบูลีน AND: หากด้านซ้ายส่งคืนสถานะการออกที่ไม่ใช่ศูนย์ตัวดำเนินการจะส่งคืนสถานะนั้นและไม่ประเมินด้านขวา (เป็นการลัดวงจร) มิฉะนั้นจะประเมินด้านขวาและส่งคืนสถานะทางออก . โดยทั่วไปจะใช้เพื่อให้แน่ใจว่าcommand2รันcommand1ก็ต่อเมื่อรันสำเร็จ

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


6
แอมเพอร์แซนด์คู่&&แตกต่างจากแอมเพอร์แซนด์เดี่ยว&ในแบชหรือไม่?
Charlie Parker

16
@CharlieParker &ทำให้คำสั่งทำงานอยู่เบื้องหลังใช่ "เรียกใช้สิ่งนี้ในพื้นหลัง" แตกต่างอย่างมากกับ "เรียกใช้คำสั่งถัดไปนี้เฉพาะเมื่อคำสั่งอื่นสำเร็จ"
cdhowie

command2 จะรันเฉพาะ command1 ที่ส่งคืนสถานะการออกเป็นศูนย์ซึ่งหมายความว่าเสร็จเรียบร้อยแล้ว ..
Nik

ไม่;ยังคงรอคำสั่งแรกที่จะจบ?
rfii

@rfii ใช่ แต่จะรันคำสั่งที่สองโดยไม่คำนึงว่าคำสั่งแรกสำเร็จหรือไม่ a;bหมายถึง "วิ่งaแล้ววิ่งb" a&&bหมายถึง "เรียกใช้aแล้วรันก็bต่อเมื่อทำได้aสำเร็จ"
cdhowie

33

command1 && command2

command1 && command2ดำเนินการcommand2ถ้าการดำเนินการ(และเฉพาะในกรณีที่) command1สิ้นสุดลงสำเร็จ ในศัพท์แสง Unix หมายถึงรหัสทางออก / รหัสส่งคืนเท่ากับศูนย์

command1; คำสั่ง 2

command1; command2ดำเนินการcommand2หลังจากดำเนินการcommand1ตามลำดับ ไม่สำคัญว่าคำสั่งนั้นจะสำเร็จหรือไม่


6

อดีตเป็นตรรกะง่ายๆANDโดยใช้การประเมินการลัดวงจรคำสั่งหลังกำหนดสองคำสั่ง

สิ่งที่เกิดขึ้นจริงคือเมื่อโปรแกรมแรกส่งคืนรหัสออกที่ไม่ใช่ศูนย์ระบบANDจะประเมินทั้งหมดFALSEและคำสั่งที่สองจะไม่ถูกดำเนินการ หลังจากนั้นก็ประหารพวกเขาทั้งสองตามลำดับ

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