Portatif olarak, bir #!
satıra birden fazla argüman koyamazsınız . Bu, yalnızca tam yol ve bir argüman (örneğin #!/bin/sed -f
veya #!/usr/bin/sed -f
) veya #!/usr/bin/env
tercümana hiçbir argüman olmadığı anlamına gelir .
Taşınabilir bir komut dosyası almak için geçici bir çözüm #!/bin/sh
, sed komut dosyasını komut satırı argümanı olarak geçen bir kabuk sarmalayıcı kullanmaktır . Bunun POSIX tarafından onaylanmadığına dikkat edin (çok amaçlı komut dosyaları -e
, taşınabilirlik için her komut için ayrı bir argümanla yazılmalıdır ), ancak birçok uygulamada çalıştığını unutmayın.
#!/bin/sh
exec sed '
s/a/b/
' "$@"
Uzun bir senaryo için, heredoc kullanmak daha uygun olabilir. Heredoc'un bir avantajı, eğer varsa, içindeki tek alıntıları alıntılamanıza gerek kalmamasıdır. Büyük bir dezavantajı, senaryonun standart girişinden başlayarak iki can sıkıcı sonuçla beslenmesidir. Bazı sed sürümleri -f /dev/stdin
bunun yerine gerektirir -f -
, bu da taşınabilirlik için bir problemdir. Daha da kötüsü, komut dosyası bir filtre işlevi göremez, çünkü standart girdi komut dosyasıdır ve veri olamaz.
#!/bin/sh
exec sed -f - -- "$@" <<'EOF'
s/a/b/
EOF
Heredokun dezavantajı, faydalı bir kullanımı ile giderilebilir cat
. Bu, komut dosyasının tamamını komut satırına yeniden koyduğundan, POSIX uyumlu değil, pratikte büyük ölçüde taşınabilir.
#!/bin/sh
exec sed "$(cat <<'EOF')" -- "$@"
s/a/b/
EOF
Başka bir geçici çözüm, hem sh hem de sed tarafından ayrıştırılabilecek bir komut dosyası yazmaktır. Bu taşınabilir, oldukça verimli, sadece biraz çirkin.
#! /bin/sh
b ()
{
x
}
i\
f true; then exec sed -f "$0" "$@"; fi
: ()
# sed script starts here
s/a/b/
açıklamalar:
- Sh altında: denilen işlevi tanımlayın
b
; içerik, sözdizimi açısından iyi biçimlendirilmiş olduğu sürece önemli değildir (özellikle boş bir işleve sahip olamazsınız). Sonra doğruysa (yani her zaman), sed
komut dosyası üzerinde yürütün .
- Sed altında:
()
etikete dallanır , daha sonra bazı iyi biçimli girdiler. Ardından i
etkisi olmayan bir komut, çünkü her zaman atlanır. Sonunda ()
etiketin ardından betiğin yararlı kısmı var.
- GNU sed, BusyBox ve OpenBSD altında test edilmiştir. (GNU sed'de daha basit bir şeyle kurtulabilirsiniz, ancak OpenBSD sed, atladığı parçalar konusunda seçicidir.)