มีความแตกต่างระหว่างเครื่องหมายแอมเพอร์แซนด์และเซมิโคลอนสองวิธีในการทุบตีอย่างไร?


71

หากฉันต้องการรันคำสั่งแยกกันสองคำในหนึ่งบรรทัดฉันสามารถทำสิ่งนี้ได้:

cd /home; ls -al

หรือสิ่งนี้:

cd /home && ls -al

และฉันก็ได้ผลเช่นเดียวกัน อย่างไรก็ตามสิ่งที่เกิดขึ้นในพื้นหลังด้วยวิธีการทั้งสองนี้? ความแตกต่างระหว่างการทำงานคืออะไร?

คำตอบ:


88

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

cd /home; ls -al

นี้จะcd /homeและแม้ว่าcdคำสั่งล้มเหลว ( /homeไม่ได้อยู่ที่คุณไม่ได้รับอนุญาตให้สำรวจมัน ฯลฯ ) ls -alมันจะทำงาน

cd /home && ls -al

สิ่งนี้จะทำงานเฉพาะในls -alกรณีที่cd /homeประสบความสำเร็จ


2
ใช้; เป็นอันตรายจริงๆ (อย่างน้อยก็มีคำสั่ง RM) cd /some/dir; rm -fr ./*ยกตัวอย่างเช่น ดังนั้นด้วยการทำลายล้างคุณต้องมั่นใจว่าคุณอยู่ในตำแหน่งที่ถูกต้องก่อนดำเนินการ rm คำสั่งที่ถูกต้องคือcd /some/dir && rm -fr ./*
ALex_hha

70
a && b

ถ้าผลตอบแทนที่เป็นศูนย์รหัสทางออกแล้วBจะถูกดำเนินการ

a || b

ถ้ากลับรหัสที่ไม่ใช่ศูนย์ทางออกแล้วBจะถูกดำเนินการ

a ; b

aถูกประหารชีวิตจากนั้นถูกดำเนินการ


16
cd /fakedir; ls -al

ทำงานlsในไดเรกทอรีปัจจุบันเพราะcd /fakedirจะล้มเหลวและเชลล์จะไม่สนใจสถานะการออกที่ไม่เป็นศูนย์

cd /fakedir && ls -al

เนื่องจาก&&โอเปอเรเตอร์จะดำเนินการต่อหากคำสั่งก่อนหน้าออกจากปกติ (สถานะเป็นศูนย์) จะไม่มีlsการดำเนินการใด ๆ

มีโอเปอเรเตอร์อื่น ๆ เช่น&ซึ่งจะทำให้กระบวนการเป็นพื้นหลัง ในขณะที่มักวางไว้ที่ส่วนท้ายของคำสั่งมันสามารถใส่ในกลางของห่วงโซ่


4

นอกจากนี้คุณยังสามารถเข้าร่วมพวกเขาด้วยกันเช่นif..then..elseสำหรับตรรกะคำสั่งผูกมัด

ตัวอย่าง:

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