Usar while read
loop:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Outra é redirecionar a saída por bloco:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Última é abrir o arquivo:
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
Se um dos comandos ler entrada, seria uma boa ideia usar outro fd para entrada, para que os comandos não o comam (aqui assumindo ksh
, zsh
ou bash
para -u 3
, use em <&3
vez disso portably):
while IFS= read -ru 3 LINE; do
...
done 3< file
Finalmente, para aceitar argumentos, você pode:
#!/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"
Qual deles poderia ser executado como:
bash script.sh file another_file
Ideia extra. Com bash
, use readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Nota: IFS=
pode ser omitido se você não se importar de ter valores de linha aparados nos espaços à esquerda e à direita.
<file xargs -L 1 -I{} command --option {} other args
Mantendo exatamente a pergunta:
fonte
A melhor resposta que encontrei é:
EDITAR:
... quatro anos depois ...
depois de vários votos negativos e um pouco mais de experiência, recomendo agora o seguinte
fonte
do "$cmd" "$i";
), a menos que tenha um motivo para não; se o arquivo contivesse uma*
como uma palavra por si só, seu código seria executado$cmd *
, o que, é claro, executaria o comando com uma lista dos arquivos no diretório atual.zsh
, o`cat`
já expandiria o*
(o não citado$i
ainda poderia expandir alguns caracteres curinga (uma segunda rodada) se a expansão de`cat`
introduzir alguns). De qualquer forma, essa abordagem está realmente errada.RESULTADO
fonte
Pegue todas as linhas de um arquivo e passe-as como argumentos para um único comando, ou seja,
Se você precisar que o
--option
sinalizador preceda cada linha, altere o segundo comando para:fonte
'
,"
,<
,>
,;
, etc (3) Esta cria um ficheiro temporário desnecessária. (4) Geralmente, coisas assim são feitas com "documentos aqui". (5) Seused
comandos são desajeitados; os dois primeiros comandos podem ser reduzidos para%s/^/ /
e%j
.