Используйте while read
цикл:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Другой - перенаправить вывод по блокам:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Последнее, чтобы открыть файл:
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
Если одна из команд читает входные данные, было бы неплохо использовать другой fd для ввода, чтобы команды не сожрали его (здесь предполагается ksh
, zsh
или bash
для -u 3
, <&3
вместо этого используйте переносимо):
while IFS= read -ru 3 LINE; do
...
done 3< file
Наконец, чтобы принять аргументы, вы можете сделать:
#!/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"
Какой из них может работать как:
bash script.sh file another_file
Дополнительная идея С bash
помощью readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Примечание: IFS=
может быть опущено, если вы не возражаете против того, чтобы значения строк обрезались от начальных и конечных пробелов.
<file xargs -L 1 -I{} command --option {} other args
Удерживая точно вопрос:
источник
Лучший ответ, который я нашел:
РЕДАКТИРОВАТЬ:
... четыре года спустя ...
после нескольких отрицательных голосов и некоторого опыта я бы порекомендовал следующее
источник
do "$cmd" "$i";
), если у вас нет причин не делать этого; если файл*
сам по себе содержит слово a, ваш код будет выполняться$cmd *
, что, конечно же, приведет к выполнению команды со списком файлов в текущем каталоге.zsh
,`cat`
уже расширил бы*
(не заключенные в кавычки$i
могли бы все еще расширить некоторый групповой символ (второй раунд), если расширение`cat`
вводит некоторое). В любом случае такой подход действительно неверен.ВЫХОД
источник
Возьмите все строки файла и передайте их в качестве аргументов одной команде, т.е.
Если вам нужен
--option
флаг перед каждой строкой, измените вторую команду на:источник
'
,"
,<
,>
,;
и т.д. (3) Это создает ненужный временный файл. (4) Подобные вещи обычно делаются с «здесь документами». (5) Вашиed
команды неуклюжи; первые две команды могут быть уменьшены до%s/^/ /
и%j
.