: di shell adalah perintah null (null command) yang tidak melakukan tindakan apa pun selain mengevaluasi argumen, dan jika digabungkan dengan ekspansi parameter, dapat menangani pemeriksaan argumen wajib dan penetapan nilai default secara ringkas
: "${1:?missing argument, aborting!}" akan mencetak pesan diagnostik ke stderr dan keluar dengan status non-nol jika $1 tidak ada atau kosong
- Jika
${VAR:=default} diberikan sebagai argumen untuk :, ekspansi tetap dijalankan tetapi string hasilnya dibuang, sehingga hanya nilai default yang ditetapkan tanpa menjalankan hasil ekspansi sebagai perintah
: juga dapat dimanfaatkan untuk mengosongkan file dan memeriksa apakah file dapat diakses lewat redirection, perintah kosong pada trap, pemeriksaan variabel di lingkungan set -u, serta cabang kondisi yang kosong
: "${VAR:=default}" hanya menuliskan nama variabel sekali sehingga mengurangi kemungkinan salah ketik, dan pada while : menjadi kondisi yang selalu sukses untuk mengekspresikan loop tak terbatas
Perintah null dan ekspansi parameter
: adalah perintah bawaan perintah null yang mengevaluasi argumen lalu membuang hasilnya
- Berasal sejak Thompson shell pada 1971; saat itu juga digunakan sebagai label dan penanda komentar pertama di Unix
- Alih-alih kondisi empat baris, argumen wajib dapat diperiksa dengan satu baris berikut
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- Sintaks ekspansi parameter
${name:?diagnostic} memeriksa apakah $name belum disetel atau kosong
- Jika tidak ada nilai,
diagnostic dicetak ke stderr dan shell keluar dengan status non-nol
- Jika ada nilai, hasilnya sama seperti
$name
- Jika hanya menjalankan
${HELLO:=123} tanpa perintah null, hasil ekspansi 123 dianggap sebagai perintah sehingga terjadi command not found
: ${HELLO:=123} mengevaluasi ekspansi, menetapkan HELLO=123, lalu membuang hasilnya
- Berbeda dengan
DATA_DIR="${DATA_DIR:-/var/data}", : "${DATA_DIR:=/var/data}" hanya menuliskan nama variabel sekali, sehingga dapat mengurangi kemungkinan salah ketik seperti DATA_DRI
Cara memanfaatkan :
-
Menetapkan nilai default
- Menetapkan nilai default variabel sambil membuang hasil ekspansi tanpa menjalankannya
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Mengosongkan file dan memeriksa akses
- Jika digabungkan dengan redirection, satu atau beberapa file dapat dikosongkan
: > error.log
: > error.log > access.log
- Dengan subshell dan redirection, juga dapat memeriksa apakah file dapat dibaca atau ditulis
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Tempat yang membutuhkan perintah kosong
- Dapat digunakan saat secara sintaks membutuhkan perintah seperti
trap, tetapi tidak boleh benar-benar melakukan pekerjaan apa pun
trap : INT
sleep 60
- Juga dapat ditempatkan pada cabang kosong dalam kondisi
if some-command; then
:
else
echo "command failed"
fi
-
Memeriksa beberapa variabel
- Saat
set -u aktif, memeriksa sekaligus apakah beberapa variabel sudah disetel
set -u
: "$DEPLOY_ENV" "$HOST"
-
Loop tak terbatas
- Karena
: adalah kondisi yang selalu sukses, loop tak terbatas dapat ditulis secara ringkas
while :; do
echo "I love colons"
sleep 1
done
1 komentar
Komentar Lobste.rs
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocdshell dan format berikut~/directoryname; <command>Setiap kali menyalin baris perintah shell, shell akan terus melakukan
cdke direktori tempat perintah itu semula dijalankanzsh, bisa diatur agar menempelkan spasi tak terlihat tanpa line break menghapus isi di sebelah kirimakebisa menjalankan beberapa prosesechosekaligus dan menulis ke stream yang sama sehingga saling mengganggu. Jika diubah seperti berikut, yang melakukan output bukan proses anak melainkan prosesmakeitu sendiriman :atauwhatis :Mirip dengan perintah
true, tetapi bedanya tidak bereaksi khusus terhadap--help,--version, dan semacamnya, serta jumlah karakternya lebih sedikithelp, bukanman:secara harfiah adalah alias daritrueNamun, belum terpikir untuk memanfaatkannya pada efek samping yang muncul saat argumen dievaluasi
:, bisa juga diawali#untuk menyimpannya sebagai komentar. Jika itu sesuatu yang akan dijalankan nanti, kelebihannya adalah ekspresi di dalamnya tidak dievaluasi lebih duluhttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"dihapuswhile true; do...while true; dohanya lebih panjang tiga karakter daripadawhile :; do, jadi sudah cukup singkat, dan kode itu tampaknya bukan contoh yang cocok untuk menyampaikan poin yang ingin dijelaskan penulis