หากฉันต้องการรันคำสั่งแยกกันสองคำในหนึ่งบรรทัดฉันสามารถทำสิ่งนี้ได้:
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 ./*