Bunu yapmanın kurallı yolu bash
gibi bir şey gibi görünüyor
unset args
while IFS= read -r line; do
args+=("$line")
done < file
cmd "${args[@]}"
veya, bash sürümünüz varsa mapfile
:
mapfile -t args < filename
cmd "${args[@]}"
Mapfile ile while-döngüsü arasında bulabildiğim tek fark, bir linere karşı
(set -f; IFS=$'\n'; cmd $(<file))
birincisi boş bir satırı boş bir argümana dönüştürür, birincisi boş bir satırı görmezden gelir. Bu durumda tek-liner davranışı yine de tercih ettiğim şeydir, bu yüzden bunun üzerinde iki katı bonus olması gerekir.
Kullanırdım IFS=$'\n' cmd $(<file)
ama işe yaramadı, çünkü yürürlüğe $(<file)
girmeden önce komut satırını oluşturmak için yorumlandı IFS=$'\n'
.
Benim durumumda işe yaramasa da, artık bir çok aracın sonlandırma çizgilerini desteklediğini, null (\000)
bunun yerine newline (\n)
, bu durumların ortak kaynakları olan dosya isimleriyle uğraşırken bunu daha kolay hale getirdiğini öğrendim. :
find / -name '*.config' -print0 | xargs -0 md5
herhangi bir globbing veya enterpolasyon yapmadan veya herhangi bir şey yapmadan md5'e argüman olarak tam nitelikli dosya adlarının bir listesini besler. Bu yerleşik olmayan çözüme yol açar
tr "\n" "\000" <file | xargs -0 cmd
bununla birlikte, boş satırları yok sayar, ancak yalnızca boşluk içeren satırları yakalar.