Mereka berdua mengisyaratkan BASH untuk memulai dengan perintah lain mengikuti simbol tetapi apakah ada perbedaan yang berbeda?
command-line
bash
Michael Terry
sumber
sumber
Anda dapat mencoba perbedaannya sendiri:
ls /invalid/path && echo "hello!"
karena / tidak valid / path tidak ada, ia tidak dapat menampilkan daftar direktori. Ini akan gagal dengan pesan kesalahan: "ls: / invalid / path: Tidak ada file atau direktori".
Bagian kedua dari perintah (echo "hello!") Bahkan tidak pernah dieksekusi karena bagian pertama gagal.
ls /invalid/path ; echo "hello!"
Pesan kesalahan yang sama muncul seperti sebelumnya, tetapi kali ini, bagian kedua dieksekusi !
ls: / invalid / path: Tidak ada file atau direktori tersebut
halo!
Mengapa ini berguna?
Misalkan Anda ingin mengekstrak file bernama archive.tar.gz
Anda bisa menggunakan perintah
tar zxvf archive.tar.gz && rm archive.tar.gz
.Jika karena alasan apa pun ekstraksi arsip gagal, bagian kedua tidak dijalankan! Anda bisa coba lagi.
Jika Anda menggunakan; dalam situasi yang sama, arsip dihapus dan Anda tidak dapat mencoba lagi.
sumber
&&
adalahAND
, yang berarti bahwa perintah kedua hanya akan dieksekusi jika yang pertama dikembalikan dengan benar (tidak ada kesalahan).sumber
AND
eksekusi parameter ke-2 menjadi tidak relevan jika yang pertama samafalse
dan dengan demikian kode yang mendasarinya dioptimalkan untuk menunda evaluasi parameter ke-2 sampai ia tahu apa yang pertama.&&
hanyalah operator biner, sebuah fungsi. Satu-satunya hal yang "istimewa" adalah notasi infiks (yang merupakan standar untuk sebagian besar dari operator semacam ini) dan menunda pelaksanaan operan kedua. Eksekusi yang tertunda itu memang memberikannya kemampuan untuk digunakan sebagai sesuatu yang dapat secara konseptual dipandang sebagaiif
pernyataan dalam konteks ini , tetapi itu tidak menghilangkan fakta bahwa penggunaan yang semula dimaksudkannya adalah dalam kondisiif
pernyataan aktual . Penggunaan di sini benar-benar lebih dari "hack".a && b || c = (a && b) || c
. Urutan evaluasi sederhana. Benar-benar tidak ada misteri di sana. Jika Anda ingin menuliskannya seperti fungsi khas Anda, itu akan terlihat sepertior(and(a, b), c)
. Logika ini sama dalamif
kondisi dan juga ketika memasukkannya langsung ke baris perintah karena&&
dan||
adalah operator , mereka mengambil dua operan dan mereka mengembalikan yang lain.Pembaruan : Saya telah menambahkan sebagai skrip untuk menyoroti beberapa perangkap yang mungkin:
Karena tidak ada orang lain yang menyebutkan "||", saya akan melakukannya
Pembaruan2 : beberapa pengulangan kata-kata penting di sini
&& adalah seperti pernyataan "lalu" dari pernyataan "jika" yang merespons "benar"
|| adalah TIDAK seperti "lain" dari "jika" pernyataan ..
|| seperti "lalu" dari pernyataan "jika" yang merespons "salah"
Lebih spesifik, && menguji $? mengembalikan nilai pernyataan yang terakhir dieksekusi
sebelumnyadan memberikan kontrol ke pernyataan atau sub-shell segera setelah && ... hanya melewati kontrol jika $? adalah benar.|| mirip, dan sering terlihat mengikuti pernyataan &&, tetapi tes untuk palsu nilai kembali ($?) dari
sebelumnyayang paling baru-baru ini dieksekusi pernyataan ... NB! , Nota Bene! Catat dengan baik! .... jika pernyataan predecing adalah pernyataan && yang mengoreksi kembali kesalahan ketika Anda mengharapkannya benar, maka || akan merespons yang salah, sehingga menggabungkan keduanya pada baris yang sama mungkin berisikoPoin utama yang saya coba buat adalah sehubungan dengan kesalahan yang saya buat. yaitu:
## [[kondisi]] && A || B
adalah tidak tidak berperilaku seperti C / C ++ gaya ternary. yaitu:
// (kondisi)? A: B
Lihat skrip di bawah ini untuk contoh hasil "tak terduga" dari "A"
Tes dasar dan && dan || pernyataan semua harus di baris yang sama ...
Jalankan skrip ini untuk mengetahui kesalahan apa yang terjadi saat menggunakan && dan ||
Pernyataan yang baru saja dieksekusi mungkin bukan yang Anda harapkan ..
[[kondisi]] && gema Halo || echo Goodbye .... biasanya aman,
karena gema yang terbentuk dengan baik akan mengembalikan true.
tetapi bagaimana dengan mengakses file yang tidak keluar?
sumber
mencoba
dan
Lihat perbedaannya
sumber
Perintah (fungsi, dalam kasus skrip) setelah
&&
dijalankan tergantung pada RETVAL dari perintah pertama (fungsi, dalam kasus skrip). Ini memaksa perintah pertama untuk mengembalikan nilai 0, jika berhasil. Kami dapat memeriksa nilai kembali untuk menjalankan perintah lebih lanjut.sumber