Tengo el siguiente script bash, por lo que tengo entendido >> se usa para agregar el resultado de un comando a un archivo existente en lugar de sobrescribirlo, pero ¿qué ¿Qué está haciendo en este caso? Este script está llamando a algunos archivos exe para convertir de un formato a otro. Hay muchos años para cada archivo, por lo que recorre cada archivo mirando el nombre del archivo. Además, cuando ejecuto este script obtengo «redireccionamiento ambiguo»
#!/bin/bash source $HOME/.bashrc jobout=${1} joberr=${2} # Set some paths and prefixes yr_bgn=2000 yr_end=2000 yr=${yr_bgn} pth_data="/mnt/" pth_rst="/mnt/" while [ ${yr} -le ${yr_end} ] do ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} let yr=${yr}+1 done
Comentarios
- ¿Cómo llamar a este script?
- posible duplicado de Redireccionamiento ambiguo realizado > $ 2
- @HaukeLaging, no, no lo es. La pregunta parece ser sobre algo parecido, pero no lo mismo
- @RomeoNinov ¿Le importaría explicar la diferencia relevante?
- @HaukeLaging el script se guarda en un archivo .sh. Solo escribo ./myscript.sh
Respuesta
1>>
y 2>>
son redirecciones para descriptores de archivos específicos, en este caso la salida estándar (descriptor de archivo 1) y el error estándar (descriptor de archivo 2).
Entonces la secuencia de comandos redirige todos los mensajes «estándar» a ${jobout}
y todos los mensajes de error a ${joberr}
. Usar >>
en ambos casos significa que todos los mensajes se adjuntan a los archivos respectivos.
Tenga en cuenta que ${jobout}
y ${joberr}
toman sus valores de los dos parámetros de la línea de comandos al script (${1}
y ${2}
) , por lo que debe especificar los archivos que desea utilizar para almacenar los mensajes. Si no se proporcionan los parámetros, el script producirá el mensaje de error de «redirección ambigua» que ha visto; el script realmente debería comprobar si se han proporcionado los parámetros y producir un mensaje de error apropiado, de lo contrario, algo como
if [ -z "$1" -o -z "$2" ]; then echo "Log files for standard and error messages must be specified" echo "${0} msgfile errfile" exit 1 fi
al comienzo del script.
Respuesta
En su caso 1 >> agregue la información del controlador de stdout actual al archivo $ {jobout} 2 >> agregue la información desde el controlador stderr actual al archivo $ {joberr}
jobout y joberr son archivos, definidos como primer y segundo parámetro del script
Respuesta
Como no hay parámetros para llamar al script, los parámetros $1
y $2
están vacíos y también $jobout
y $joberr
.
Debe llamar al script de esta manera:
./myscript.sh file1 file2
Comentarios
- Los números de parámetro no tienen nada que ver con los números antes de
>>
operadores de redirección . - No importa, veo que ' está respondiendo la parte sobre la redirección ambigua, no la pregunta del título. Probablemente debería aclarar su respuesta sobre esto.