Linux Bash Syntax: Arti dari &&, \, dan -


14

Apa arti ' &&', ' \' dan ' -' di akhir perintah bash?

Secara khusus, saya menemukan kombinasi garis berikut yang seharusnya menambahkan kunci publik ke manajer paket aptitude Ubuntu, untuk apa karakter yang digunakan di sini?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get pembaruan

"/" tidak sama dengan "\"
Thomas

Thomas: Memperbaiki jabatannya
Kyle Brandt

Garis miring terbalik di sini tidak diperlukan karena && juga cukup untuk menyiratkan kelanjutan garis. Menggunakan backslash, bagaimanapun, membantu keterbacaan.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:


37

"&&" digunakan untuk mengaitkan perintah bersama, sehingga perintah berikutnya dijalankan jika dan hanya jika perintah sebelumnya keluar tanpa kesalahan (atau, lebih tepatnya, keluar dengan kode pengembalian 0).

"\" dengan sendirinya di akhir baris adalah cara menggabungkan baris bersama. Jadi dua baris berikut:

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

diproses persis sama seperti jika baris ditulis sebagai satu baris:

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

"-" adalah argumen baris perintah tanpa fungsi bash khusus. Cara penanganannya bergantung pada perintah yang sedang dijalankan (dalam hal ini apt-key ). Bergantung pada konteks, ini biasanya digunakan untuk menunjukkan " membaca data dari stdin daripada dari file ", atau " memproses sisa baris sebagai data daripada sebagai argumen baris perintah ".


5
Dalam hal ini, '-' bukan parameter sudo tetapi 'apt-key', yang berarti bahwa alih-alih file kunci, 'apt-key' menggunakan data yang datang melalui pipa ('|') ke stdin sebagai kunci. Opsi "gpg --export", tanpa memiliki '--output a_file_name.key', dorong kunci baru dari stdout gpg, melalui pipa ('|') ke stdin 'apt-key' Mudah: - )
edomaur

2
wah itulah yang saya dapatkan untuk menjawab pertanyaan sambil setengah tidur. tetap.
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

&& Apakah logika AND:
&& adalah cara untuk mengekspresikan Logical AND , yang berarti seluruh ekspresi adalah Benar hanya jika kedua sisi itu benar. Dalam logika, dikatakan bahwa seluruh pernyataan (P&Q) hanya benar ketika P dan Q benar.

Sebagai akibatnya, komputer umumnya memperlakukan P&Q sebagai evaluasi arus pendek . Jadi karena seluruh pernyataan hanya akan Benar jika P dan Q benar, maka jika P salah, pernyataan Q tidak dievaluasi . Pada dasarnya komputer itu malas (efisien), dan tidak repot mengevaluasi Q jika mereka juga tidak. Ini juga Benar logis ATAU, lihat tautan sebelumnya.

Tiga Konteks && di Bash:

1) Menggunakan Evaluasi Sirkuit Pendek dengan status keluar dari Perintah:
Setiap perintah memiliki status keluar. Jika suatu perintah memiliki kesalahan, ia memiliki status keluar yang bukan nol. Jadi jika status keluar adalah bukan nol dan && digunakan untuk mengaitkan perintah bersama menjadi pernyataan, perintah selanjutnya tidak akan dievaluasi (dieksekusi) jika yang sebelumnya tidak memiliki status keluar 0 (Benar). Ini karena evaluasi hubung singkat. Jadi, jika Anda memiliki:

P && Q

Q tidak akan dieksekusi jika P tidak benar (jika P keluar dengan status apa pun kecuali 0, itu tidak benar). Sama seperti:

./configure && make

make tidak akan dieksekusi jika configure memiliki kesalahan, itu tidak benar. Jadi pada dasarnya, maka akhirnya menjadi cara menulis jika pernyataan itu:

if ./configure ; then
   make
fi

Perlu diingat bahwa dalam sebagian besar konteks 0 adalah salah, tetapi tidak ketika datang ke status keluar.

2) && Dapat Digunakan dalam perintah uji Bash bawaan [[]]:

&& Dapat juga digunakan di dalam perintah uji bawaan di bash [[]] untuk menggabungkan ekspresi dengan cara yang sama seperti menggabungkan perintah. Seluruh operasi pengujian hanya akan benar jika kedua operan (sisi) && benar, misalnya:

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

akan menjadi cara untuk mengatakan jika $ a adalah bilangan bulat antara 2 dan 5 (tidak termasuk 2 dan 5).

3) Evaluasi Aritmatika:

Terakhir, && dapat digunakan dalam evaluasi aritmatika sebagai Logis DAN. Jika keduanya (logis DAN) dari angka-angka di bawah ini adalah bukan nol, angka itu mengembalikan 0, kalau tidak 1 akan dikembalikan:

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

@ Kyle: && digunakan di luar ekspresi logis adalah "DAN kontrol operator", perilaku serupa tapi secara teknis berbeda
drAlberT

Jangan ikuti komentar Anda, apa maksud Anda di luar ekspresi logis?
Kyle Brandt

Maksud saya bahwa dalam ekspresi operator && kontrol mengasumsikan rata-rata "logis dan", kalau tidak itu hanya "dan". Ini adalah "DAN operator kontrol", yang digunakan dalam daftar. operator logis digunakan dalam konteks ekspansi aritmatika, dalam ekspresi.
drAlberT

dalam if [./configure]contoh, Anda harus menghapus tanda kurung. Yang benar adalahif ./configure; then make...
Juliano

Juliano, tangkapan bagus, akan diperbarui. AlberT, apakah ada perbedaan selain ketentuan yang diberikan halaman manual?
Kyle Brandt

3

Saya pikir Anda akan lebih baik dengan penjelasan tentang makna "nyata", implikasi adalah hal lain :)

  • && adalah operator kontrol "DAN". Dari bash man :
    Operator kontrol && dan || masing-masing menunjukkan daftar AND dan daftar OR.
    Daftar DAN memiliki formulir  
        command1 && command2     
    command2 dijalankan jika, dan hanya jika, command1 mengembalikan status keluar dari nol.
    [..memotong..]
    Status pengembalian daftar AND dan OR adalah status keluar dari perintah terakhir
    dieksekusi dalam daftar.
    
    Sebuah Operator kontrol adalah
    Token yang menjalankan fungsi kontrol. Ini adalah salah satu dari simbol berikut:
        || & &&; ;; () |
    
  • \adalah " karakter melarikan diri ", dan itu adalah salah satu dari tiga mekanisme penawaran yang tersedia di bash:
    Mengutip
       Mengutip digunakan untuk menghapus makna khusus karakter atau kata-kata tertentu ke shell.
    [..memotong..]
       Ada tiga mekanisme penawaran: karakter melarikan diri, kutipan tunggal, dan kutipan ganda.
       Garis miring terbalik (\) adalah karakter pelolosan. Ini mempertahankan nilai literal dari karakter berikutnya yang mengikuti, dengan pengecualian. Jika \ pair muncul, dan garis miring terbalik itu sendiri tidak dikutip, \ diperlakukan sebagai kelanjutan garis (yaitu, itu dihapus dari aliran input dan secara efektif diabaikan).
    [..memotong..]
    Backslash mempertahankan makna khusus hanya ketika diikuti oleh salah satu karakter berikut: $, `,", \, atau.
    
    Ini berarti bahwa jika Anda meletakkan karakter pelarian ("\") di akhir baris, Anda sebenarnya melarikan diri karakter baris baru yang langsung mengikutinya (karakter RETURN) sehingga memiliki efek "lanjutkan garis" yang lain sudah menjelaskan dalam jawaban mereka
  • Tanda hubung dasbor " - " yang diterima beberapa perintah sebagai parameter adalah konvensi, bukan char atau operator khusus shell. Seperti yang sudah ditunjukkan sebelumnya, ini adalah semacam penanda tempat untuk stream I / O standar. Tergantung pada program yang kita rujuk, ia mungkin tetap untuk stdin (input standar) atau stdout (output standar).

2 sen saya


1
Mungkin akan menjadi kasus tl; dr. Menempelkan potongan-potongan raksasa dari sebuah halaman buku - mencerahkan seperti apa adanya - mungkin hanya akan mengintimidasi OP.
rodjek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.