DevOps Foundations · Modül 3: Bash ve Python ile güvenli otomasyon
Kabuk Alıntılama, Çıkış Kodları ve Hatlar
Otomasyon hasarlarının çoğu alıntısız değişkenle başlar. Bu ders kabuk genişlemesini öngörülebilir kılar; betikler arızada yüksek sesle durur, aşağılarda sessizce sürünmez.
10 dk okuma
Kazanımlar
- Alıntısız her genişlemede kelime bölünme ve joker eşleşmesini tahmin etmek
- Çıkış kodları ve set -euo pipefail ile topallamak yerine hızlı düşmek
- PIPESTATUS değişkeninin $? değişkeninin söylemediğini neyi söylediğini açıklamak
- Kırılgan tek satırı boşluklu dosya adlarının sağ çıkacağı hale getirmek
Neden önemli
Temizlik betiği bir yıl her gece çalışır; sonra "Q3 report (final).txt" adlı dosyayla tanışır ve yanlış dizini siler. Betikte hiçbir şey değişmedi; veri değişti. Kabuk betikleri varsayılan olarak hasmane girdi işler, çünkü dosya adları, API yanıtları ve kullanıcı girdisi aynı genişleme kurallarından geçer. Alıntılama tarz değildir; alet ile tehlike arasındaki farktır.
Kavramlar
Kabuk alıntısız değişkenleri üç adımda genişletir: değeri boşluklardan böl,
- gibi jokerleri eşleşen isimlere genişlet, parçaları ayrı argüman geçir.
"$file" içinde ne olursa olsun tek argümandır; $file kelime sayısı kadar argümandır, biri * içeriyorsa üstüne dizin listesi. Çift tırnak genişlemeye izin verir ama bölme ve jokeri bastırır; tek tırnak her şeyi bastırır. Kural tek satırdır: bu genişlemenin bölünmesi gerektiğini söyleyemiyorsan her genişlemeyi alıntıla.
Çıkış kodları betiğin tek dürüst kanalıdır. Sıfır başarı, diğer her şey belirli arıza demektir; if her kodu varsayılan görmezden gelir ve sonraki satıra yürür. Üç koruma bunu değiştirir: set -e ilk düşen komutta çıkar, set -u ilk tanımsız değişkende çıkar, set -o pipefail hattın son komutun başarısını değil en sağdaki arızayı raporlamasını sağlar. set -euo pipefail üçlüsü sessiz bozulmayı satır numaralı anında duruşa çevirir.
Hatlar arızaları tasarım gereği saklar: a | b | c sonrasındaki $? yalnızca c'yi raporlar. b düşüp c boş girdide başarılı olursa betik başarıyı raporlar, veri gider. PIPESTATUS sonradan her aşamanın kodunu tutar; pipefail hattın kendisini düşürür. Ortadaki asla bozulmaz umuduna ikisini de tercih et.
Uygulamalı örnek
Yedek döngüsü boşluklu isimlerde kırılıyor. Önce:
for f in $(ls /srv/data); do cp $f /backup/; done
Tek satırda iki arıza: $(ls) isimleri boşluklardan böler; alıntısız $f yine böler ve jokerler. Onarım:
#!/usr/bin/env bash set -euo pipefail src="/srv/data" for f in "$src"/*; do [ -e "$f" ] || continue cp -- "$f" /backup/ done
Beklenen okuma: joker ayrıştırılmış metin yerine gerçek isimlere genişler, her genişleme alıntılıdır, -- tireli isimlerin bayrak sayılmasını önler; her arıza (kayıp kaynak, dolu yedek diski) yarım veri kopyalayıp başarı raporlamak yerine betiği durdurur. L07 labı bu kırılma sınıfını alıntılama refleks olana kadar canlandırır.
Yaygın yanlış hamle
ls çıktısını ayrıştırmak. Dosya adları boşluk, satır sonu ve önde tire içerebilir; ls insanlara biçimlendirir, döngülere değil. Jokerler, read -d ile find -print0 ve diziler tam da ls ayrıştırma güvenli yapılamadığı için vardır. İçinde $(ls ...) veya ls geri-tırnağı olan her betik baştan bozuktur; dosya adlarını değil döngüyü yeniden yaz.
Lab ve sonraki adım
L07 labı boşluklu dosyalarda kırılan betiği verir; alıntılı onarım ve düşüp geçen test ister. Sırada 2. ders: betikleri iki kez çalışmaya güvenli yapar; idempotency.
Mini kontrol
4 soruluk isteğe bağlı öz kontrol. Yanıtlar cihazından çıkmaz, saklanmaz ve hiçbir değerlendirmeye sayılmaz.
Ders geri bildirimi
Henüz yayında geri bildirim yok.
Geri bildirim yazmak için giriş yap ve dersi tamamla.
Kaynaklar
Alıştırma
Elindeki dosya-döngülü betiği al (ya da /tmp altında yukarıdaki bozuk betiği yaz). Boşluklu isimlere karşı çalıştır, arızayı kaydet, alıntılı onarımı uygula; ShellCheck sonucunun temiz çıktığını göster.
Geçme kriterleri
Arıza düzeltmeden önce boşluklu isimle yeniden üretilmiş; onarılmış betik set -euo pipefail ile baştan sona alıntılı; ShellCheck çıktısı temiz gösterilmiş.