Bash / sh - ความแตกต่างระหว่าง && และ;


139

ผมปกติใช้;ในการรวมคำสั่งมากกว่าหนึ่งในสาย &&แต่บางคนชอบ มีความแตกต่างกันหรือไม่? ตัวอย่างเช่นcd ~; cd -และcd ~ && cd -ดูเหมือนว่าจะทำสิ่งเดียวกัน รุ่นใดพกพาสะดวกกว่าเช่นจะรองรับ bash-subset เช่นเปลือกของ Android หรือไม่

คำตอบ:


197

หากคำสั่งก่อนหน้าล้มเหลวด้วยคำสั่ง;ที่สองจะทำงาน

แต่ด้วย&&ครั้งที่สองจะไม่ทำงาน

นี่คือตัวถูกดำเนินการ "และ" ตรรกะ "ขี้เกียจ" ระหว่างการดำเนินการ


2
กล่าวอีกนัยหนึ่งมันมีพฤติกรรมลัดวงจร
peterchaula

@peter คนไหน? ;หนึ่งหรือ&&หนึ่ง? หรือคุณหมายถึงทั้งสองอย่าง?
Shayan

@ ไชยันต์&&.
peterchaula

58

ฉันใช้งาน&&เนื่องจากคอมพิวเตอร์ที่อยู่ใกล้เคียงมานานแล้ว

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

แต่ไม่ได้ช่วย ... ;)

cd /tnp/test && rm -rf * มีความปลอดภัย... ;)


27
เพื่อความปลอดภัยฉันจะใช้rm -rf /tnp/test
melvynkim

7
เพื่อให้ปลอดภัยยิ่งขึ้นควรใช้rm /tnp/test/ -rfเพื่อป้องกันการเข้าสู่ missclick ที่เป็นอันตราย
radrow

22

ในcmd1 && cmd2, cmd2จะดำเนินการเฉพาะในกรณีที่cmd1ประสบความสำเร็จ (ผลตอบแทน 0)

ในcmd1 ; cmd2, cmd2จะถูกดำเนินการในกรณีใด ๆ

โครงสร้างทั้งสองเป็นส่วนหนึ่งของเชลล์ที่เข้ากันได้กับ POSIX


11

&&หมายถึงดำเนินการคำสั่งถัดไปหากออกก่อนหน้าด้วยสถานะ 0 สำหรับตรงกันข้ามใช้||ie เพื่อดำเนินการหากคำสั่งก่อนหน้าออกโดยมีสถานะไม่เท่ากับ 0;ดำเนินการเสมอ

มีประโยชน์มากเมื่อคุณต้องดำเนินการบางอย่างขึ้นอยู่กับว่าคำสั่งก่อนหน้านี้เสร็จสิ้นตกลงหรือไม่


5

คำสั่งที่แยกจากกัน;จะดำเนินการตามลำดับโดยไม่คำนึงถึงสถานะความสมบูรณ์

ด้วย&&คำสั่งที่สองจะดำเนินการต่อเมื่อคำสั่งแรกดำเนินการสำเร็จ (ส่งคืนสถานะการออกเป็น 0)

สิ่งนี้ครอบคลุมอยู่ใน manpage bash ด้านListsล่าง ฉันคาดหวังว่าเชลล์ที่เหมือน Unix จะรองรับโอเปอเรเตอร์ทั้งสองนี้ แต่ฉันไม่รู้เฉพาะเกี่ยวกับเชลล์ Android


2
นี่คือลิงค์ไปยังคู่มือ bash: gnu.org/software/bash/manual/bashref.html#Lists
Glenn Jackman

3

&&อนุญาตให้ดำเนินการตามเงื่อนไขในขณะที่;มีการเรียกใช้คำสั่งที่สองเสมอ

ในเช่นcommand1 && command2, command2จะดำเนินการเมื่อcommand1ได้สิ้นสุดลงด้วยexit 0การส่งสัญญาณทั้งหมดไปได้ด้วยดีขณะที่อยู่ในคำสั่งที่สองจะถูกดำเนินการไม่ว่าผลที่ได้จากการcommand1 ; command2command1


1

&& เป็นตรรกะและในการทุบตี Bash มีการประเมินการลัดวงจรของตรรกะ AND สำนวนนี้เป็นวิธีที่ง่ายกว่าในการแสดงสิ่งต่อไปนี้:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

ในขณะที่; เวอร์ชันเป็นเพียง:


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