xargs je nejflexibilnější řešení pro rozdělení výstupu na argumenty příkazu.
Je také velmi dobře čitelný a snadno použitelný díky jednoduché parametrizaci.
Formát je xargs -n $NUMLINES mycommand .
Například do echo každý jednotlivý řádek v souboru /tmp/tmp.txt udělali byste:
cat /tmp/tmp.txt | xargs -n 1 echo
Nebo na diff každý postupný pár souborů uvedený jako řádky v souboru s výše uvedeným názvem byste udělali:
cat /tmp/tmp.txt | xargs -n 2 diff
-n 2 pokyn xargs konzumovat a předat jako samostatné argumenty dva řádky toho, co jste do něj vložili najednou.
xargs si můžete přizpůsobit k rozdělení podle oddělovačů kromě konce řádku/nového řádku.
Použijte man xargs a google, abyste se dozvěděli více o síle tohoto všestranného nástroje.
Nejlepší způsob, jak toho dosáhnout, je přesměrovat soubor do smyčky:
# Basic idea. Keep reading for improvements.
FILE=test
while read CMD; do
echo "$CMD"
done < "$FILE"
Přesměrování s < "$FILE" má oproti cat "$FILE" | while ... několik výhod . Vyhne se zbytečnému používání kočky a ušetří zbytečný dětský proces. Vyhne se také běžnému úskalí, kdy smyčka běží v podskořápce. V Bash jsou příkazy v | potrubí běží v podskořápkách, což znamená, že přiřazení proměnných se po skončení smyčky ztratí. Přesměrování pomocí < nemá tento problém, takže můžete použít $CMD za smyčkou nebo upravit jiné proměnné uvnitř smyčky. Také se opět vyhne zbytečným podřízeným procesům.
Je možné provést některá další vylepšení:
- Přidejte
IFS=takžereadneořízne úvodní a koncové mezery z každého řádku. - Přidejte
-rnareadaby se zabránilo interpretaci zpětných lomítek jako únikových sekvencí. - malá písmena
CMDaFILE. Bashova konvence je, že pouze proměnné prostředí a vnitřního prostředí jsou velká písmena. - Použijte
printfmístoechocož je bezpečnější, pokud$cmdje řetězec jako-n, což jeechobude interpretováno jako vlajka.
file=test
while IFS= read -r cmd; do
printf '%s\n' "$cmd"
done < "$file"
To, co máte, je text "cat test" do smyčky.
Vy jen chcete:
cat test | \
while read CMD; do
echo $CMD
done