Vím, že tento problém mohu vyřešit několika způsoby, ale zajímalo by mě, jestli existuje způsob, jak to udělat pouze pomocí vestavěných bash, a pokud ne, jaký je nejúčinnější způsob, jak to udělat.
Mám soubor s obsahem jako
AAA
B C DDD
FOO BAR
tím mám na mysli pouze to, že má několik řádků a každý řádek může nebo nemusí mít mezery. Chci spustit příkaz jako
cmd AAA "B C DDD" "FOO BAR"
Pokud použiji cmd $(< file)
chápu
cmd AAA B C DDD FOO BAR
a pokud použiji cmd "$(< file)"
chápu
cmd "AAA B C DDD FOO BAR"
Jak dosáhnu toho, že každý řádek zpracuje přesně jeden parametr?
Přijatá odpověď:
Přenosně:
set -f # turn off globbing
IFS='
' # split at newlines only
cmd $(cat <file)
unset IFS
set +f
Nebo pomocí subshell vytvořit IFS
a místní změny voleb:
( set -f; IFS='
'; exec cmd $(cat <file) )
Shell provádí dělení polí a generování názvu souboru na základě výsledku substituce proměnné nebo příkazu, který není v uvozovkách. Musíte tedy vypnout generování souborů pomocí set -f
a nakonfigurujte rozdělení polí pomocí IFS
aby byly oddělenými poli pouze nové řádky.
S konstrukty bash nebo ksh toho moc získat nelze. Můžete vytvořit IFS
lokální pro funkci, ale ne set -f
.
V bash nebo ksh93 můžete pole uložit do pole, pokud je potřebujete předat více příkazům. Rozšiřování musíte ovládat v době, kdy sestavujete pole. Poté "${a[@]}"
expanduje na prvky pole, jeden na slovo.
set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"