Pertanyaan Apa gunanya bash Null-operator ":", usus besar?


Apa gunanya operator "null" dalam skrip BASH? Saya mengerti bahwa itu digunakan sebagai placeholder mengikuti suatu if perintah ketika Anda tidak memiliki sesuatu untuk dikatakan, tetapi perlu perintah untuk memungkinkan program berjalan dengan benar. Tapi apa gunanya untuk itu? Kapan kamu akan menggunakannya? Kapan masuk akal untuk menggunakannya?


9
2017-11-14 14:55


asal


juga baca Menggunakan Colon Sebagai Operator Bash Null - αғsнιη
Alasan Anda mengutip adalah salah satu yang cukup penting. Mengapa Anda membutuhkan lebih banyak? - terdon♦


Jawaban:


Terkadang berguna untuk memungkinkan efek samping parameter ekspansi terjadi.

Misalnya, pengaturan nilai default

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

13
2017-11-14 15:00



Bisakah Anda menjelaskan simbol-demi-simbol bagaimana garis kedua bekerja? - Ruslan
Baca tentang : perintah dan ekspansi parameter di manual bash. - glenn jackman
Untuk menguraikan apa yang dirujuk oleh @glennjackman, baris kedua memanggil perintah null:, dan ${name:="John Doe"} akan diperluas, menyebabkan penugasan berlangsung karena dibaca sebagai argumen untuk:. Tanpa: shell akan mencoba menjalankan "John Doe" sebagai perintah, atau nilainya $name jika sudah diatur - imkendal


Anda juga dapat menggunakannya untuk loop tanpa akhir:

while : ; do 
   # ....
done

10
2017-11-14 15:04



Tetapi mungkin while true lebih mudah dibaca, karena (a) menggunakan lebih sedikit tanda baca, dan (b) lebih mirip dengan bahasa C-derived. - wchargin


Anda dapat menggunakannya untuk membuat file tanpa menjalankan program ::

: > /path/to/file

Ini sangat jauh lebih cepat daripada touch /path/to/file (karena tidak perlu menjalankan touch program) dan mungkin sedikit lebih portabel daripada sekadar polos

> /path/to/file

yang tampaknya bekerja pada banyak sistem. Demikian pula, itu bisa digunakan untuk periksa apakah Anda memiliki akses tulis ke file:

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

meskipun ini, juga, umumnya dapat dilakukan tanpa :. Peringatan:

  • Ini tidak memeriksa apakah file sudah ada. Jika tidak, ini akan membuat file jika memiliki izin untuk melakukannya.
  • Jika file tidak ada, dan skrip Anda tidak memiliki izin untuk membuatnya, ini akan melaporkan "menulis izin ditolak".

(Lihat pertanyaan terkait untuk alasan mengapa ini lebih dapat diandalkan daripada if [ -w /path/to/file ].)


7
2017-11-14 18:19





Jalan kembali, di Unix V6 dan Thompson Shell, yang : sebenarnya digunakan sebagai bagian dari goto pernyataan. Menurut manual, awalnya muncul di versi 3 dari Unix:

Seluruh file perintah dicari untuk baris yang dimulai dengan: sebagai karakter pertama yang tidak kosong, diikuti oleh satu atau lebih kosong, dan kemudian label. Jika ditemukan garis seperti itu, goto akan mengulang pengubahan file perintah ke baris setelah label dan keluar. Ini menyebabkan shell dipindahkan ke garis berlabel.

Saat ini, di bash, Ini digunakan sebagai operator no-op, mengembalikan kesuksesan. Memang, jika Anda melihat kode sumber, Anda akan melihat keduanya true dan : gunakan fungsi yang sama, int colon_builtin(), di bawahnya. Tidak ada : perintah non-builtin, dan /bin/true sebenarnya adalah perintah yang cukup besar untuk apa yang dilakukannya.

: bisa digunakan di mana saja true digunakan, misalnya di command_that_can_fail || true, meskipun itu mungkin membingungkan non-ahli. Baca lebih lanjut tentang itu sini.


1
2018-06-01 22:46





Anda dapat menggunakannya pada tes positif if perintah ketika Anda hanya ingin melakukan sesuatu di sisi negatif. Sebagai contoh:

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

Tanpa : bash akan menghasilkan kesalahan sintaks.

Ini adalah contoh yang terlalu disederhanakan. Umumnya Anda akan menggunakan teknik seperti itu dalam pengkodean awal ketika Anda belum menulis segmen kode itu dan hanya membutuhkan sesuatu yang tidak menghasilkan kesalahan.


1
2017-07-13 01:57



Jawaban yang bagus, meskipun mungkin tidak jelas pada awalnya, bahwa ini paling berguna dengan perintah yang sebenarnya dalam kondisi pengujian, misalnya if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi akan menampilkan kesalahan hanya jika firefox tidak berjalan. Dengan kata lain, ketika Anda perlu melakukan sesuatu hanya ketika perintah memiliki kesalahan. Dengan cara ini setara dengan pgrep firefox || echo "Firefox not running", meskipun lebih mudah dibaca dan memungkinkan lebih banyak perintah - Sergiy Kolodyazhnyy


Saya hanya menggunakannya dalam skrip dengan perintah SSH untuk menjaga skrip agar tidak error.

Dalam hal ini, saya ingin melihat apakah pengguna dapat terhubung ke satu set server. Jika koneksi baik-baik saja, host jarak jauh akan bergema OK. Jika koneksi gagal, SSH akan merespons dengan kesalahan. Namun, saya ingin skrip saya keluar dengan 0 dan bukan nilai dari perintah SSH jika gagal. Jadi pada dasarnya saya menjebak kesalahan SSH dengan ORING itu ||dengan perintah null :. Terlihat seperti ini:

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

Dengan begitu saya mendapatkan output dari SSH tetapi bukan kode kesalahan:

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....

0
2017-11-29 22:07