ไวยากรณ์ Linux Bash: ความหมายของ &&, \, และ -


14

' &&', ' \' และ ' -' หมายถึงอะไรในตอนท้ายของคำสั่ง bash?

โดยเฉพาะอย่างยิ่งฉันเจอชุดของบรรทัดต่อไปนี้ที่ควรเพิ่มพับลิกคีย์ให้กับตัวจัดการแพ็กเกจความถนัดของ Ubuntu ตัวละครเหล่านี้ใช้สำหรับอะไร

    gpg - keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg - ส่งออก - เกราะ 26C2E075 | sudo apt-key add - && \
    sudo apt-get update

"/" ไม่เหมือนกับ "\"
โทมัส

Thomas: แก้ไขโพสต์ของเขา
Kyle Brandt

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

คำตอบ:


37

"&&"ใช้เพื่อรวมคำสั่งต่างๆเข้าด้วยกันเช่นนั้นคำสั่งถัดไปจะทำงานถ้าหากคำสั่งก่อนหน้านี้ออกโดยไม่มีข้อผิดพลาด (หรือแม่นยำมากขึ้นจะออกด้วยรหัสส่งคืน 0)

"\"ด้วยตัวเองที่ส่วนท้ายของบรรทัดคือวิธีการต่อแถวเข้าด้วยกัน ดังนั้นสองบรรทัดต่อไปนี้:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

มีการประมวลผลเหมือนกับว่าบรรทัดถูกเขียนเป็นบรรทัดเดียว:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-"เป็นอาร์กิวเมนต์บรรทัดคำสั่งที่ไม่มีฟังก์ชั่นทุบตีที่เฉพาะเจาะจง วิธีการจัดการนั้นขึ้นอยู่กับคำสั่งที่กำลังรัน (ในกรณีนี้คือapt-key ) โดยทั่วไปจะใช้เพื่อระบุว่า " อ่านข้อมูลจาก stdin มากกว่าจากไฟล์ " หรือ " ประมวลผลส่วนที่เหลือของบรรทัดเป็นข้อมูลแทนที่จะเป็นอาร์กิวเมนต์บรรทัดคำสั่ง "


5
ในกรณีนี้ '-' ไม่ใช่พารามิเตอร์ของ sudo แต่เป็น 'apt-key' ซึ่งหมายความว่าแทนที่จะเป็นไฟล์คีย์ 'apt-key' กำลังใช้ข้อมูลที่ส่งผ่านไปป์ ('|') ไปยัง stdin เป็นกุญแจสำคัญ ตัวเลือก "gpg --export" โดยไม่ต้องมี '- เอาท์พุท a_file_name.key' ให้ดันคีย์ใหม่ออกมาจาก gpg stdout ผ่านไปป์ ('|') ไปยัง stdin ของ 'apt-key' ง่าย: - )
edomaur

2
ขออภัย นั่นคือสิ่งที่ฉันได้รับเมื่อตอบคำถามขณะหลับครึ่ง แก้ไขแล้ว.
goldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&& เป็นตรรกะ AND:
&& เป็นวิธีในการแสดงตรรกะและหมายถึงการแสดงออกทั้งหมดเป็นจริงเฉพาะเมื่อทั้งสองด้านเป็นจริง ในทางตรรกะแล้วมีการกล่าวข้อความทั้งหมด (P&Q) เป็นจริงเฉพาะเมื่อทั้ง P และ Q เป็นจริง

เป็นผลมาจากนี้คอมพิวเตอร์การรักษาโดยทั่วไป P & Q เป็นการประเมินผลการลัดวงจร ดังนั้นตั้งแต่คำสั่งทั้งหมดจะเป็นจริงถ้าทั้ง p และ q เป็นจริงแล้วถ้า P เป็นเท็จงบ Q ไม่ได้ประเมิน คอมพิวเตอร์โดยทั่วไปจะขี้เกียจ (มีประสิทธิภาพ) และไม่ต้องกังวลกับการประเมิน Q หากไม่มีเช่นกัน นี่เป็นจริงของตรรกะหรือดูลิงค์ก่อนหน้า

สามบริบทของ && ใน Bash:

1) การใช้การประเมินผลแบบลัดวงจรกับสถานะทางออกของคำสั่ง:
ทุกคำสั่งมีสถานะออก หากคำสั่งมีข้อผิดพลาดคำสั่งจะมีสถานะออกที่ไม่ใช่ศูนย์ ดังนั้นหากสถานะการออกไม่เป็นศูนย์และ && จะใช้ในการโยงคำสั่งเข้าด้วยกันในคำสั่งคำสั่งในภายหลังจะไม่ถูกประเมิน (ดำเนินการ) หากสถานะก่อนหน้าไม่มีสถานะการออกเป็น 0 (True) นี่เป็นเพราะการประเมินผลการลัดวงจร ดังนั้นถ้าคุณมี:

P && Q

Q จะไม่ถูกดำเนินการหาก P ไม่เป็นความจริง (ถ้า P ออกจากสถานะใด ๆ ยกเว้น 0 จะไม่เป็นจริง) เช่นเดียวกับ:

./configure && make

make จะไม่ถูกเรียกใช้งานหากการกำหนดค่ามีข้อผิดพลาดไม่ใช่จริง ดังนั้นโดยทั่วไปแล้วจะเป็นวิธีการเขียนในถ้างบแล้ว:

if ./configure ; then
   make
fi

โปรดทราบว่าบริบทส่วนใหญ่ 0 เป็นเท็จ แต่ไม่ใช่เมื่อมาถึงสถานะออก

2) && สามารถใช้ในคำสั่งทดสอบของ Bash ที่สร้างขึ้นใน [[]]:

&& ยังสามารถใช้ภายในคำสั่งทดสอบในตัวใน bash [[]] เพื่อรวมนิพจน์ในลักษณะที่คล้ายกันกับการรวมคำสั่ง การทดสอบทั้งหมดจะเป็นจริงเฉพาะเมื่อทั้งตัวถูกดำเนินการ (ด้าน) ของ && เป็นจริงตัวอย่างเช่น:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

จะเป็นวิธีการบอกว่า $ a เป็นจำนวนเต็มระหว่าง 2 ถึง 5 (ไม่รวม 2 และ 5)

3) การประเมินผลทางคณิตศาสตร์:

สุดท้ายสามารถใช้ && ในการประเมินทางคณิตศาสตร์เป็นแบบตรรกะและ ถ้าทั้งสอง (ตรรกะ AND) ของตัวเลขในรายการต่อไปนี้ไม่ใช่ศูนย์มันจะคืนค่า 0, จะส่งคืน 1 มิฉะนั้น:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle: && ใช้นอกนิพจน์ตรรกะคือ "ผู้ประกอบการและการควบคุม" พฤติกรรมคล้ายกัน แต่แตกต่างกันในทางเทคนิค
drAlberT

อย่าติดตามความคิดเห็นของคุณคุณหมายถึงอะไรนอกการแสดงออกทางตรรกะ?
Kyle Brandt

ฉันหมายถึงว่าในการแสดงออกผู้ประกอบการ && ควบคุมถือว่าค่าเฉลี่ยของ "ตรรกะและ" มิฉะนั้นจะเป็นเพียง "และ" มันเป็น "และตัวควบคุมการควบคุม" ที่ใช้ในรายการ ตัวดำเนินการเชิงตรรกะถูกใช้ในบริบทของการขยายเลขคณิตภายในนิพจน์
drAlberT

ในif [./configure]ตัวอย่างคุณควรลบวงเล็บ ถูกต้องคือif ./configure; then make...
Juliano

Juliano จับได้ดีจะอัปเดต AlberT มีความแตกต่างจากเงื่อนไขที่หน้าคู่มือให้ไว้หรือไม่
Kyle Brandt

3

ฉันคิดว่าคุณจะดีขึ้นด้วยการอธิบายความหมาย "ของจริง" ความหมายเป็นอีกเรื่องหนึ่ง :)

  • &&เป็นตัวดำเนินการควบคุม "AND" จากคนทุบตี :
    ผู้ประกอบการควบคุม && และ || แสดงถึงรายการ AND และรายการ OR ตามลำดับ
    รายการ AND มีแบบฟอร์ม  
        command1 && command2     
    command2 จะถูกดำเนินการถ้าและถ้า command1 ส่งคืนสถานะการออกเป็นศูนย์
    [..ตัด..]
    สถานะการส่งคืนของรายการ AND และ OR คือสถานะการออกของคำสั่งสุดท้าย
    ดำเนินการในรายการ
    
    ประกอบการควบคุมคือ
    โทเค็นที่ทำหน้าที่ควบคุม มันเป็นหนึ่งในสัญลักษณ์ต่อไปนี้:
        || & &&; ;; () |
    
  • \คือ " escape character " และเป็นหนึ่งในสามกลไกที่มีอยู่ใน bash:
    quoting
       การอ้างอิงใช้เพื่อลบความหมายพิเศษของอักขระหรือคำบางคำในเชลล์
    [..ตัด..]
       มีกลไกการอ้างถึงสามแบบ: อักขระยกเว้นเครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่
       เครื่องหมายแบ็กสแลชที่ไม่ใช่เครื่องหมายอัญประกาศ (\) คืออักขระเลี่ยง มันรักษาคุณค่าที่แท้จริงของตัวละครต่อไปที่ตามมาด้วยข้อยกเว้น หากมี \ pair ปรากฏขึ้นและเครื่องหมายแบ็กสแลชไม่ได้อ้างถึงตัวมันเอง \ ถือเป็นความต่อเนื่องของบรรทัด (นั่นคือมันจะถูกลบออกจากอินพุตสตรีมและละเว้นอย่างมีประสิทธิภาพ)
    [..ตัด..]
    แบ็กสแลชจะคงความหมายพิเศษไว้เฉพาะเมื่อตามด้วยอักขระตัวใดตัวหนึ่งต่อไปนี้: $, `,", \, หรือ
    
    ซึ่งหมายความว่าหากคุณใส่อักขระเลี่ยง ("\") ที่ส่วนท้ายสุดของบรรทัดคุณจะหนีจากอักขระบรรทัดใหม่ที่ตามมาทันที (อักขระ RETURN) ซึ่งจะมีผลต่อ "ต่อบรรทัด" คนอื่น ๆ ได้อธิบายไปแล้วในคำตอบของพวกเขา
  • เครื่องหมายขีดกลาง " - " ที่บางคำสั่งยอมรับในฐานะพารามิเตอร์เป็นแบบแผนไม่ใช่แบบอักขระพิเศษของเชลล์หรือตัวดำเนินการ ดังที่คนอื่น ๆ ชี้ไปแล้วมันเป็นเครื่องหมายบอกตำแหน่งสำหรับกระแส I / O มาตรฐาน ขึ้นอยู่กับโปรแกรมที่เราอ้างถึงว่าอาจอยู่สำหรับ stdin (อินพุตมาตรฐาน) หรือ stdout (เอาต์พุตมาตรฐาน)

2 เซนต์ของฉัน


1
อาจเป็นกรณีของ tl; dr วางก้อนยักษ์ของ manpage - enlightening ตามที่เป็น - อาจจะเพียงแค่ข่มขู่ OP
rodjek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.