GNU/Linux >> Znalost Linux >  >> Linux

Náhrada příkazů:rozdělení na nový řádek, ale ne mezera?

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[@]}"

Linux
  1. Proč substituce příkazů Shell pohltí znak na konci nového řádku?

  2. Zachycování chyb při substituci příkazů pomocí „-o Errtrace“ (tj. Set -e)?

  3. Náhrada příkazů pomocí „?

  1. Gnu Awk Errno není nastaveno při selhání příkazu?

  2. id:příkaz nenalezen

  3. w:příkaz nenalezen

  1. df:příkaz nenalezen

  2. du:příkaz nenalezen

  3. Příkaz Conda pracuje v příkazovém řádku, ale ne ve skriptu bash