Cú pháp Linux Bash: Ý nghĩa của &&, \ và -


14

' &&', ' \' Và ' -' có nghĩa là gì khi kết thúc các lệnh bash?

Cụ thể, tôi đã xem qua sự kết hợp các dòng được cho là thêm khóa công khai vào trình quản lý gói năng khiếu của Ubuntu, những ký tự này được sử dụng ở đây để làm gì?

    gpg --keyerver keyerver.ubfox.com --recv 26C2E075 && \
    gpg - xuất khẩu - trang 26C2E075 | sudo apt-key thêm - && \
    sudo apt-get cập nhật

"/" không giống như "\"
Thomas

Thomas: Đã sửa bài đăng của anh ấy
Kyle Brandt

Dấu gạch chéo ngược ở đây là không cần thiết vì && cũng sẽ đủ để ngụ ý tiếp tục dòng. Tuy nhiên, sử dụng dấu gạch chéo ngược giúp hỗ trợ khả năng đọc.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


37

"&&" được sử dụng để xâu chuỗi các lệnh lại với nhau, sao cho lệnh tiếp theo được chạy khi và chỉ khi lệnh trước đó thoát mà không có lỗi (hoặc chính xác hơn là thoát với mã trả về 0).

"\" tự nó ở cuối dòng là một phương tiện nối các đường với nhau. Vậy hai dòng sau:

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

được xử lý chính xác giống như khi dòng được viết dưới dạng dòng đơn:

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

"-" là một đối số dòng lệnh không có hàm bash cụ thể. Chính xác cách nó được xử lý phụ thuộc vào lệnh đang được chạy (trong trường hợp này là apt-key ). Tùy thuộc vào ngữ cảnh, nó thường được sử dụng để chỉ " đọc dữ liệu từ stdin chứ không phải từ tệp " hoặc " xử lý phần còn lại của dòng dưới dạng dữ liệu thay vì đối số dòng lệnh ".


5
Trong trường hợp này, '-' không phải là tham số của sudo mà là 'apt-key', nghĩa là thay vì tệp chính, 'apt-key' đang sử dụng dữ liệu đi qua đường ống ('|') vào stdin của nó làm chìa khóa Tùy chọn "gpg --export", không có '--output a_file_name.key', đẩy một khóa mới ra khỏi thiết bị xuất chuẩn gpg, thông qua đường ống ('|') đến stdin của 'apt-key' Easy: - )
edomaur

2
Rất tiếc. đó là những gì tôi nhận được để trả lời các câu hỏi trong khi nửa ngủ. đã sửa.
goldPseudo

6
&& == 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

&& Là logic VÀ:
&& là cách diễn đạt logic VÀ , có nghĩa là toàn bộ biểu thức là True chỉ khi cả hai mặt của nó đều đúng. Trong logic, người ta nói rằng toàn bộ tuyên bố (P & Q) chỉ đúng khi cả P ​​và Q đều đúng.

Do đó, các máy tính thường coi P & Q là một đánh giá ngắn mạch . Vì vậy, vì toàn bộ câu lệnh sẽ chỉ đúng nếu cả P ​​và Q đều đúng, nên nếu P sai, câu lệnh Q không được đánh giá . Về cơ bản, máy tính rất lười biếng (hiệu quả) và đừng bận tâm đến việc đánh giá Q nếu chúng không có. Điều này cũng đúng với logic HOẶC, xem liên kết trước.

Ba bối cảnh của && trong Bash:

1) Sử dụng Đánh giá ngắn mạch với trạng thái thoát của Lệnh:
Mỗi lệnh đều có trạng thái thoát. Nếu một lệnh có lỗi, nó có trạng thái thoát khác không. Vì vậy, nếu trạng thái thoát là khác không và && được sử dụng để xâu chuỗi các lệnh lại với nhau thành một câu lệnh, các lệnh sau sẽ không được đánh giá (được thực thi) nếu trạng thái trước đó không có trạng thái thoát là 0 (Đúng). Điều này là do đánh giá ngắn mạch. Vì vậy, nếu bạn có:

P && Q

Q sẽ không được thực thi nếu P không đúng (nếu P thoát với trạng thái bất cứ điều gì ngoài 0, thì điều đó không đúng). Cũng giống như:

./configure && make

thực hiện sẽ không được thực thi nếu cấu hình có lỗi, không đúng. Về cơ bản, sau đó kết thúc là một cách viết trong câu lệnh if then:

if ./configure ; then
   make
fi

Hãy ghi nhớ sau đó trong hầu hết các bối cảnh 0 là sai, nhưng không phải khi nói đến trạng thái thoát.

2) && Có thể được sử dụng trong lệnh kiểm tra [[]] tích hợp của Bash:

&& Cũng có thể được sử dụng bên trong lệnh kiểm tra tích hợp trong bash [[]] để kết hợp các biểu thức theo cách tương tự như kết hợp các lệnh. Toàn bộ hoạt động kiểm tra sẽ chỉ đúng nếu cả hai toán hạng (bên) của && đều đúng, chẳng hạn:

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

sẽ là một cách để nói nếu $ a là một số nguyên nằm trong khoảng từ 2 đến 5 (không bao gồm 2 và 5).

3) Đánh giá số học:

Cuối cùng, && có thể được sử dụng trong đánh giá số học dưới dạng logic VÀ. Nếu cả hai (logic AND) của các số sau đây đều khác không, nó trả về 0, 1 khác được trả về:

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

@Kyle: && được sử dụng bên ngoài một biểu thức logic là "Toán tử điều khiển AND", hành vi tương tự nhưng khác về mặt kỹ thuật
drAlberT

Đừng theo dõi bình luận của bạn, bạn có ý nghĩa gì ngoài một biểu thức logic?
Kyle Brandt

Ý tôi là trong một biểu thức, toán tử && control giả sử giá trị trung bình của "logic và", nếu không thì nó chỉ là "và". Nó là "toán tử điều khiển AND", được sử dụng trong các danh sách. toán tử logic được sử dụng trong bối cảnh mở rộng số học, trong các biểu thức.
drAlberT

trong if [./configure]ví dụ này, bạn nên xóa dấu ngoặc. Đúng làif ./configure; then make...
Juliano

Juliano, bắt tốt, sẽ cập nhật. AlberT, có sự khác biệt nào ngoài các điều khoản mà các trang nam đưa ra không?
Kyle Brandt

3

Tôi nghĩ bạn sẽ tốt hơn với một lời giải thích về ý nghĩa "thực sự", hàm ý là một điều khác :)

  • && là toán tử điều khiển "VÀ". Từ bash man :
    Các toán tử điều khiển && và || biểu thị danh sách AND và danh sách OR tương ứng.
    Một danh sách AND có dạng  
        lệnh1 && lệnh2     
    lệnh2 được thực thi nếu và chỉ khi, lệnh1 trả về trạng thái thoát bằng không.
    [..cắt..]
    Trạng thái trả về của danh sách AND và OR là trạng thái thoát của lệnh cuối cùng
    thực hiện trong danh sách.
    
    Một toán tử điều khiển
    Một mã thông báo thực hiện chức năng kiểm soát. Đây là một trong những biểu tượng sau:
        | | & &&; ;; () |
    
  • \là " ký tự thoát " và nó là một trong ba cơ chế trích dẫn có sẵn trong bash:
    NHANH CHÓNG
       Trích dẫn được sử dụng để loại bỏ ý nghĩa đặc biệt của các ký tự hoặc từ nhất định vào vỏ.
    [..cắt..]
       Có ba cơ chế trích dẫn: ký tự thoát, dấu ngoặc đơn và dấu ngoặc kép.
       Dấu gạch chéo ngược không trích dẫn (\) là ký tự thoát. Nó bảo tồn giá trị theo nghĩa đen của ký tự tiếp theo, ngoại trừ. Nếu một cặp \ xuất hiện và dấu gạch chéo ngược không được trích dẫn, \ được coi là tiếp tục dòng (nghĩa là, nó bị xóa khỏi luồng đầu vào và bị bỏ qua một cách hiệu quả).
    [..cắt..]
    Dấu gạch chéo ngược chỉ giữ lại ý nghĩa đặc biệt của nó khi được theo sau bởi một trong các ký tự sau: $, `,", \, hoặc.
    
    Điều này có nghĩa là nếu bạn đặt một ký tự thoát ("\") ở cuối dòng thì thực tế bạn đang thoát khỏi dòng char mới ngay sau nó (char RETURN) do đó có tác dụng "tiếp tục dòng" những người khác đã giải thích trong câu trả lời của họ
  • Dấu gạch ngang " - " mà một số lệnh chấp nhận làm tham số là quy ước, không phải là toán tử hoặc toán tử đặc biệt shell. Như đã chỉ ra, đây là một loại điểm đánh dấu cho các luồng I / O tiêu chuẩn. Tùy thuộc vào chương trình, chúng tôi đề cập đến nó có thể ở lại stdin (đầu vào tiêu chuẩn) hoặc thiết bị xuất chuẩn (đầu ra tiêu chuẩn).

2 xu của tôi


1
Có lẽ sẽ là một trường hợp của tl; dr. Dán các khối khổng lồ của một trang web - khai sáng như nó - có lẽ sẽ chỉ khiến OP sợ hãi.
Rodjek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.