linux - for - Redirigir la salida de bash para el bucle
script unix (3)
Tengo un comando BASH simple que se parece a
for i in `seq 2`; do echo $i; done; > out.dat
Cuando esto se ejecuta, la salida de la seq 2
se envía al terminal y nada se envía al archivo de datos (out.dat)
Estoy esperando que se redireccione la salida estándar a out.dat, simplemente ejecuta el comando seq 2 > out.dat
Otra posibilidad, para completar: puede mover la salida dentro del bucle, usando >>
para anexar al archivo, si existe.
for i in `seq 2`; do echo $i >> out.dat; done;
Cuál es mejor depende ciertamente del caso de uso. Escribir el archivo de una vez es mejor que anexarlo mil veces. Además, si el ciclo contiene múltiples instrucciones de echo
, todas las cuales irán al archivo, hacer done > out.dat
es probablemente más legible y más fácil de mantener. La ventaja de esta solución, por supuesto, es que brinda más flexibilidad.
Tratar:
(for i in `seq 2`; do echo $i; done;) > out.dat
Retire su punto y coma.
for i in `seq 2`; do echo "$i"; done > out.dat
SUGERENCIAS
También como lo sugirió Fredrik Pihl, trate de no usar binarios externos cuando no los necesite, o al menos cuando prácticamente no:
for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat
Además, tenga cuidado con los resultados en words
que pueden causar la expansión del nombre de ruta.
for A in $(echo ''*''); do echo "$A"; done
Mostraría sus archivos en lugar de solo un literal *
.
$()
también se recomienda como una sintaxis más clara para la sustitución de comandos en los shells Bash y POSIX que en los backticks ( `
), y admite el anidamiento.
Las soluciones más limpias así como para leer la salida a las variables son
while read VAR; do
...
done < <(do something)
Y
read ... < <(do something) ## Could be done on a loop or with readarray.
for A in "${ARRAY[@]}"; do
:
done
El uso de printf también puede ser una alternativa más fácil con respecto a la función prevista:
printf ''%s/n'' {1..2} > out.dat