Que signifie «1 >>» et «2 >>» dans un script bash?

15

J'ai le script bash suivant, d'après ce que je comprends >> est utilisé pour ajouter la sortie d'une commande à un fichier existant au lieu de l'écraser, mais que fait-il dans ce cas? Ce script appelle certains fichiers exe pour convertir d'un format à un autre. Il y a de nombreuses années pour chaque fichier, il parcourt donc chaque fichier en regardant le nom du fichier. De plus, lorsque j'exécute ce script, je reçois une "redirection ambiguë"

#!/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
la source
Comment appelez-vous ce script?
Hauke ​​Laging
doublon possible de la redirection Ambigous fait> 2 $
Hauke ​​Laging
@HaukeLaging, non, ce n'est pas le cas. La question semble concerner quelque chose de proche, mais pas la même
Romeo Ninov
@RomeoNinov Pourriez-vous expliquer la différence pertinente?
Hauke ​​Laging
@HaukeLaging le script est enregistré dans un fichier .sh. Je tape juste ./myscript.sh
Herman Toothrot

Réponses:

19

1>>et 2>>sont des redirections pour des descripteurs de fichiers spécifiques, dans ce cas la sortie standard (descripteur de fichier 1) et l'erreur standard (descripteur de fichier 2).

Le script redirige donc tous les messages "standard" vers ${jobout}et tous les messages d'erreur vers ${joberr}. L'utilisation >>dans les deux cas signifie que tous les messages sont ajoutés aux fichiers respectifs.

Notez que ${jobout}et ${joberr}prenez leurs valeurs des deux paramètres de ligne de commande dans le script ( ${1}et ${2}), vous devez donc spécifier les fichiers que vous souhaitez utiliser pour stocker les messages. Si les paramètres ne sont pas fournis, le script produira le message d'erreur de "redirection ambiguë" que vous avez vu; le script devrait vraiment vérifier si les paramètres ont été fournis et produire un message d'erreur approprié sinon, quelque chose comme

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

au début du script.

Stephen Kitt
la source
2

Dans votre cas 1 >> ajoutez les informations du gestionnaire stdout actuel au fichier $ {jobout} 2 >> ajoutez les informations du gestionnaire stderr actuel au fichier $ {joberr}

jobout et joberr sont des fichiers, définis comme premier et deuxième paramètres du script

Roméo Ninov
la source
1

Comme il les paramètres sont pas de paramètres en appelant le script $1et $2sont vides et sont donc $joboutet $joberr.

Vous devez appeler le script comme ceci:

./myscript.sh file1 file2
Hauke ​​Laging
la source
Les numéros de paramètres n'ont rien à voir avec les numéros avant >>les opérateurs de redirection.
Barmar
Peu importe, je vois que vous répondez à la partie concernant la redirection ambiguë, pas à la question dans le titre. Vous devriez probablement clarifier votre réponse à ce sujet.
Barmar