Użyj while read
pętli:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Innym jest przekierowanie wyjścia według bloku:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Ostatnim jest otwarcie pliku:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Jeśli jedno z poleceń czyta wejście, byłby to dobry pomysł, aby użyć innego fd dla wejścia więc polecenia nie zje go (tutaj zakładając ksh
, zsh
albo bash
za -u 3
, użyj <&3
zamiast przenośnie):
while IFS= read -ru 3 LINE; do
...
done 3< file
Wreszcie, aby zaakceptować argumenty, możesz:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Który mógłby działać jako:
bash script.sh file another_file
Dodatkowy pomysł. Za bash
pomocą readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Uwaga: IFS=
można pominąć, jeśli nie przeszkadza ci przycinanie wartości linii spacji wiodących i końcowych.
<file xargs -L 1 -I{} command --option {} other args
Trzymając się dokładnie pytania:
źródło
Najlepsza odpowiedź, jaką znalazłem, to:
EDYTOWAĆ:
... cztery lata później ...
po kilku głosach negatywnych i kilku doświadczeniach poleciłbym teraz następujące
źródło
do "$cmd" "$i";
), chyba że masz powód, aby tego nie robić; jeśli plik*
sam w sobie zawiera słowo, uruchomiłby się kod$cmd *
, co oczywiście uruchomiłoby polecenie z listą plików w bieżącym katalogu.zsh
tym,`cat`
że już rozwinąłby*
(niekwotowany$i
mógłby nadal rozwinąć niektóre symbole wieloznaczne (druga runda), jeśli rozszerzenie`cat`
wprowadzi niektóre). W każdym razie takie podejście jest rzeczywiście błędne.WYNIK
źródło
Weź wszystkie wiersze pliku i przekaż je jako argumenty do pojedynczego polecenia, tj.
Jeśli potrzebujesz
--option
flagi, aby poprzedzać każdą linię, zmień drugie polecenie na:źródło
'
,"
,<
,>
,;
, itd. (3) tworzy niepotrzebny plik tymczasowy. (4) Takie rzeczy zwykle wykonuje się za pomocą „tutaj dokumentów”. (5) Twojeed
polecenia są niezdarne; pierwsze dwa polecenia można zredukować do%s/^/ /
i%j
.