Usar while read
bucle:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Otra es redirigir la salida por bloque:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Lo último es abrir el archivo:
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
Si uno de los comandos lee input, sería una buena idea usar otro fd para input para que los comandos no lo coman (aquí suponiendo ksh
, zsh
o bash
para -u 3
, usar <&3
en su lugar de forma portátil):
while IFS= read -ru 3 LINE; do
...
done 3< file
Finalmente para aceptar argumentos, puedes hacer:
#!/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"
¿Cuál podría ejecutarse como:
bash script.sh file another_file
Idea extra. Con bash
, use readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Nota: IFS=
puede omitirse si no le importa que se reduzcan los valores de línea de los espacios iniciales y finales.
<file xargs -L 1 -I{} command --option {} other args
Manteniendo precisamente la pregunta:
fuente
La mejor respuesta que encontré es:
EDITAR:
... cuatro años después ...
Después de varios votos negativos y algo más de experiencia, recomendaría ahora lo siguiente
fuente
do "$cmd" "$i";
) a menos que tenga una razón para no hacerlo; si el archivo contuviera una*
palabra, el código se ejecutaría$cmd *
, lo que, por supuesto, ejecutaría el comando con una lista de los archivos en el directorio actual.zsh
, el`cat`
ya se expandiría*
(el no citado$i
aún podría expandir algunos comodines (una segunda ronda) si la expansión de`cat`
introduce algunos). En cualquier caso, ese enfoque es erróneo.SALIDA
fuente
Tomar todas las líneas de un archivo y pasarlas como argumentos a un solo comando, es decir,
Si necesita que la
--option
bandera preceda a cada línea, cambie el segundo comando a:fuente
'
,"
,<
,>
,;
, etc (3) Esto crea un archivo temporal innecesaria. (4) Cosas como esta generalmente se hacen con "documentos aquí". (5) Tused
comandos son torpes; Los dos primeros comandos se pueden reducir a%s/^/ /
y%j
.