อะไรคือความแตกต่างระหว่าง“ คำสั่ง && คำสั่ง” และ“ คำสั่ง; คำสั่ง”


49

ฉันเห็นการใช้งานสองอย่างนี้ใน Ubuntu "command && command" และ "command; command"
เช่นapt-get update && apt-get upgrade

ถ้าฉันใช้จะแตกต่างกันapt-get update; apt-get upgradeอย่างไร
ฉันไม่ได้ร้องขอการใช้งานเฉพาะนี้ แต่โดยทั่วไปแล้วการใช้งานสองอย่างนี้แตกต่างกันอย่างไร


2
& (simple sequencing), && (conditional AND) and || (conditional OR)วินบรรทัดคำสั่งและชุดมีคุณสมบัติเดียวกัน:
Karan

5
ดูเพิ่มเติม: คู่มืออ้างอิงทุบตี - รายชื่อของคำสั่ง โดยทั่วไปแล้วไม่มีอะไรที่คุณไม่สามารถหาได้ในเอกสาร; มันคุ้มค่าที่จะดูถ้าคุณมีคำถามเกี่ยวกับองค์ประกอบของไวยากรณ์ที่เฉพาะเจาะจง
slhck

1
@ Karan และเพื่อความสมบูรณ์ bash (linux / Ubuntu) ก็มี||เช่นกัน
Izkata

คำตอบ:


88

&&เป็นตัวดำเนินการเชิงตรรกะ ;เป็นลำดับที่ง่าย

ในcmd1 && cmd2cmd2 จะทำงานถ้า cmd1 ออกจากด้วยรหัสส่งคืนที่สำเร็จเท่านั้น

ในขณะที่cmd1; cmd2cmd2 จะทำงานโดยไม่คำนึงถึงสถานะการออกของ cmd1 (สมมติว่าคุณยังไม่ได้ตั้งค่าเปลือกของคุณให้ออกจากความล้มเหลวทั้งหมดในสคริปต์หรือบางสิ่ง)

ในบันทึกย่อที่เกี่ยวข้องด้วยการcmd1 || cmd2ใช้ตัว||ดำเนินการเชิงตรรกะ 'OR' จะมีการเรียกใช้ cmd2 ต่อเมื่อ cmd1 ล้มเหลวเท่านั้น (ส่งคืนรหัสออกที่ไม่ใช่ศูนย์)

ตัวดำเนินการเชิงตรรกะเหล่านี้บางครั้งใช้ในสคริปต์แทนการพื้นฐานถ้าคำสั่ง ตัวอย่างเช่น,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... สามารถทำให้รัดกุมยิ่งขึ้นด้วย:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"

ฉันคิดว่ามันผิดพลาดเล็กน้อยเพราะจากความเข้าใจของฉันรหัสส่งคืนที่ประสบความสำเร็จหมายถึง 0 ซึ่งเมื่อนำไปใช้ในบูลจะให้ตรรกะที่เป็นเท็จ ดังนั้นด้วยปรัชญาของการประเมินผลของแมคคาร์ธีที่ใช้ในภาษาส่วนใหญ่มันควรจะส่งคืนเท็จทันทีแทนที่จะประเมิน (เรียกใช้) คำสั่งถัดไป
Della

33

วากยสัมพันธ์

command1 && command2

command2จะถูกดำเนินการถ้าและหากcommand1คืนสถานะการออกเป็นศูนย์ (จริง ) ในคำอื่น ๆ ทำงานและถ้ามันเป็นที่ประสบความสำเร็จแล้วเรียกใช้command1command2

command1 ; command2

ทั้งcommand1และcommand2จะถูกดำเนินการโดยไม่คำนึงถึง อัฒภาคอนุญาตให้คุณพิมพ์คำสั่งมากมายในหนึ่งบรรทัด

ที่เกี่ยวข้อง :

command1 || command2

command2จะถูกดำเนินการถ้าและถ้า command1ส่งคืนสถานะการออกที่ไม่ใช่ศูนย์ ในคำอื่น ๆ ทำงานประสบความสำเร็จหรือเรียกใช้command1command2


ตัวอย่าง

&& ผู้ประกอบการ:

$ rm /tmp/filename && echo "File deleted"

; ผู้ประกอบการ:

$ echo "foo" ; echo "bar"

|| ผู้ประกอบการ:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

ลิงค์จากภายนอก

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