- Shell'deki
: hiçbir işlem yapmadan sadece argümanları değerlendiren bir null command'dır; parametre genişletmeyle birleştirildiğinde zorunlu argüman kontrolü ve varsayılan değer atamayı kısa biçimde yapabilir
: "${1:?missing argument, aborting!}" ifadesi, $1 yoksa veya boşsa tanı mesajını stderr'e yazar ve sıfır olmayan bir durum koduyla çıkar
${VAR:=default} ifadesi : komutunun argümanı olarak verilirse genişletme çalışır ama ortaya çıkan string atılır; böylece genişletme sonucunu komut olarak çalıştırmadan yalnızca varsayılan değer atanabilir
- Dosya boşaltma ve erişilebilirlik kontrolü için yönlendirme ile birlikte,
trap içindeki boş komut, set -u ortamındaki değişken kontrolleri ve boş koşul dallarında da : kullanılabilir
: "${VAR:=default}" değişken adını yalnızca bir kez yazarak yazım hatası olasılığını azaltır ve while: içinde her zaman başarılı olan bir koşul olarak sonsuz döngüyü ifade eder
Null command ve parametre genişletme
:, argümanları değerlendirdikten sonra sonucu atan bir null command yerleşik komutudur
- Kökeni 1971'deki Thompson shell'e kadar gider; o dönemde label ve Unix'in ilk yorum işareti olarak da kullanılmıştır
- Dört satırlık bir koşul bloğu yerine şu tek satırla zorunlu argüman kontrolü yapılabilir
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- Parametre genişletme söz dizimi
${name:?diagnostic}, $name değişkeninin tanımlı olup olmadığını ya da boş olup olmadığını kontrol eder
- Değer yoksa
diagnostic mesajını stderr'e yazar ve shell'i sıfır olmayan bir durum koduyla sonlandırır
- Değer varsa
$name ile aynı sonucu üretir
- Null command olmadan yalnızca
${HELLO:=123} çalıştırılırsa, genişletme sonucu olan 123 bir komut gibi ele alınır ve command not found hatası oluşur
: ${HELLO:=123} ifadesi genişletmeyi değerlendirip HELLO=123 atamasını yapar, ama sonucu atar
: "${DATA_DIR:=/var/data}", DATA_DIR="${DATA_DIR:-/var/data}" ifadesinden farklı olarak değişken adını yalnızca bir kez yazar; böylece DATA_DRI gibi yazım hatası olasılığını azaltır
: kullanma yolları
-
Varsayılan değer atama
- Genişletme sonucunu çalıştırmadan atarken değişkenin varsayılan değerini belirler
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Dosya boşaltma ve erişim kontrolü
- Yönlendirme ile birleştirildiğinde bir veya daha fazla dosyayı boşaltabilir
: > error.log
: > error.log > access.log
- Alt kabuk ve yönlendirme kullanılarak dosyanın okunabilir ya da yazılabilir olup olmadığı da kontrol edilebilir
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Boş komut gereken yerler
trap gibi söz dizimi gereği bir komutun gerektiği ama gerçekte hiçbir iş yapılmaması gereken durumlarda kullanılabilir
trap : INT
sleep 60
- Koşul ifadelerinde boş bırakılacak dallara da yerleştirilebilir
if some-command; then
:
else
echo "command failed"
fi
-
Birden çok değişkeni kontrol etme
set -u etkin durumdayken birden çok değişkenin tanımlı olup olmadığını tek seferde kontrol eder
set -u
: "$DEPLOY_ENV" "$HOST"
-
Sonsuz döngü
: her zaman başarılı olan bir koşul olduğu için sonsuz döngü kısa ve net biçimde yazılabilir
while :; do
echo "I love colons"
sleep 1
done
1 yorum
Lobste.rs yorumları
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocdseçeneğini ve şu biçimi de kullanıyorlar~/directoryname; <command>Shell’in komut satırını her kopyaladığınızda, komutun ilk çalıştırıldığı dizine tekrar tekrar
cdedilmiş olurzsh’de görünmeyen, satır sonu olmayan boşluk yapıştırıldığında soldaki içeriği silecek şekilde ayarlıyorlarmake, birden fazlaechosürecini aynı anda çalıştırıp aynı stream’e çıktı verdirdiği için çıktılar birbirine karışabilir. Aşağıdaki gibi değiştirildiğinde çıktı, alt süreçten değilmakesürecinin kendisinden gelirman :veyawhatis :ile işe yarar bir belge bulmak zordutruekomutuna benzer, ancak--help,--versiongibi seçeneklere özel tepki vermez ve daha az karakterlidirmanyerinehelpile aranmalı:kelimenin tam anlamıylatrueiçin bir alias’tırAncak argümanları değerlendirirken oluşan yan etkiler için kullanmayı düşünmemiştim
:yerine#koyup yorum olarak kaydetmek de mümkün. Daha sonra çalıştırılacak bir şeyse, içindeki ifadelerin önceden değerlendirilmemesi avantajı varhttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"kullanımını kaldırınca çalışıp çalışmadığı merak ediliyorwhile true; do...’dan daha çok şaşırtma olasılığı yüksekwhile true; do,while :; do’dan yalnızca üç karakter daha uzun, yani yeterince kısa; bu kod da yazarın anlatmak istediği noktaya uygun bir örnek gibi görünmüyor