¿Qué significa `1 >>` y `2 >>` en un script bash?

15

Tengo el siguiente script bash, por lo que entiendo >> se usa para agregar la salida de un comando a un archivo existente en lugar de sobrescribir, pero ¿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 "redirección ambigua"

#!/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
Herman Toothrot
fuente
¿Cómo se llama este guión?
Hauke ​​Laging
posible duplicado de redireccionamiento Ambigous hecho> $ 2
Hauke ​​Laging
@HaukeLaging, no, no lo es. La pregunta parece ser sobre algo cercano, pero no es lo mismo
Romeo Ninov
@RomeoNinov ¿Te importaría explicar la diferencia relevante?
Hauke ​​Laging
@HaukeLaging el script se guarda en un archivo .sh. Acabo de escribir ./myscript.sh
Herman Toothrot

Respuestas:

19

1>>y 2>>son redirecciones para descriptores de archivo específicos, en este caso la salida estándar (descriptor de archivo 1) y el error estándar (descriptor de archivo 2).

Por lo tanto, el script redirige todos los mensajes "estándar" ${jobout}y todos los mensajes de error ${joberr}. El uso >>en ambos casos significa que todos los mensajes se agregan a los archivos respectivos.

Tenga en cuenta eso ${jobout}y ${joberr}tome 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 usar para almacenar los mensajes. Si no se proporcionan los parámetros, el script generará el mensaje de error de "redirección ambigua" que ha visto; el script realmente debería verificar si los parámetros se han proporcionado y generar un mensaje de error apropiado, de lo contrario,

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 guión.

Stephen Kitt
fuente
2

En su caso 1 >> agregue la información del controlador stdout actual al archivo $ {jobout} 2 >> agregue la información del controlador stderr actual al archivo $ {joberr}

jobout y joberr son archivos, definidos como primer y segundo parámetro del script

Romeo Ninov
fuente
1

Como no hay parámetros al llamar a la secuencia de comandos, los parámetros $1y $2están vacíos y también lo están $jobouty $joberr.

Debe llamar al script de esta manera:

./myscript.sh file1 file2
Hauke ​​Laging
fuente
Los números de parámetros no tienen nada que ver con los números antes de los >>operadores de redireccionamiento.
Barmar
No importa, veo que estás respondiendo la parte sobre la redirección ambigua, no la pregunta en el título. Probablemente deberías aclarar tu respuesta al respecto.
Barmar