หากฉันต้องการรันคำสั่งแยกกันสองคำในหนึ่งบรรทัดฉันสามารถทำสิ่งนี้ได้:
cd /home; ls -al
หรือสิ่งนี้:
cd /home && ls -al
และฉันก็ได้ผลเช่นเดียวกัน อย่างไรก็ตามสิ่งที่เกิดขึ้นในพื้นหลังด้วยวิธีการทั้งสองนี้? ความแตกต่างระหว่างการทำงานคืออะไร?
หากฉันต้องการรันคำสั่งแยกกันสองคำในหนึ่งบรรทัดฉันสามารถทำสิ่งนี้ได้:
cd /home; ls -al
หรือสิ่งนี้:
cd /home && ls -al
และฉันก็ได้ผลเช่นเดียวกัน อย่างไรก็ตามสิ่งที่เกิดขึ้นในพื้นหลังด้วยวิธีการทั้งสองนี้? ความแตกต่างระหว่างการทำงานคืออะไร?
คำตอบ:
;เพียงแค่แยกคำสั่งหนึ่งจากที่อื่น &&กล่าวเพียงเรียกใช้คำสั่งต่อไปนี้หากก่อนหน้านี้ก็ประสบความสำเร็จ
cd /home; ls -al
นี้จะcd /homeและแม้ว่าcdคำสั่งล้มเหลว ( /homeไม่ได้อยู่ที่คุณไม่ได้รับอนุญาตให้สำรวจมัน ฯลฯ ) ls -alมันจะทำงาน
cd /home && ls -al
สิ่งนี้จะทำงานเฉพาะในls -alกรณีที่cd /homeประสบความสำเร็จ
a && b
ถ้าผลตอบแทนที่เป็นศูนย์รหัสทางออกแล้วBจะถูกดำเนินการ
a || b
ถ้ากลับรหัสที่ไม่ใช่ศูนย์ทางออกแล้วBจะถูกดำเนินการ
a ; b
aถูกประหารชีวิตจากนั้นขถูกดำเนินการ
cd /fakedir; ls -al
ทำงานlsในไดเรกทอรีปัจจุบันเพราะcd /fakedirจะล้มเหลวและเชลล์จะไม่สนใจสถานะการออกที่ไม่เป็นศูนย์
cd /fakedir && ls -al
เนื่องจาก&&โอเปอเรเตอร์จะดำเนินการต่อหากคำสั่งก่อนหน้าออกจากปกติ (สถานะเป็นศูนย์) จะไม่มีlsการดำเนินการใด ๆ
มีโอเปอเรเตอร์อื่น ๆ เช่น&ซึ่งจะทำให้กระบวนการเป็นพื้นหลัง ในขณะที่มักวางไว้ที่ส่วนท้ายของคำสั่งมันสามารถใส่ในกลางของห่วงโซ่
นอกจากนี้คุณยังสามารถเข้าร่วมพวกเขาด้วยกันเช่นif..then..elseสำหรับตรรกะคำสั่งผูกมัด
ตัวอย่าง:
ls file.ext && echo "file exists" || echo "file does not exist"
;เป็นอันตรายจริงๆ (อย่างน้อยก็มีคำสั่ง RM)cd /some/dir; rm -fr ./*ยกตัวอย่างเช่น ดังนั้นด้วยการทำลายล้างคุณต้องมั่นใจว่าคุณอยู่ในตำแหน่งที่ถูกต้องก่อนดำเนินการ rm คำสั่งที่ถูกต้องคือcd /some/dir && rm -fr ./*