Was bedeuten "1 >>" und "2 >>" in einem Bash-Skript?

15

Ich habe das folgende Bash-Skript, von dem ich verstehe, dass >> verwendet wird, um die Ausgabe eines Befehls an eine vorhandene Datei anzuhängen, anstatt sie zu überschreiben, aber was macht es in diesem Fall? Dieses Skript ruft einige exe-Dateien auf, um sie von einem Format in ein anderes zu konvertieren. Es gibt viele Jahre für jede Datei, daher durchläuft es jede Datei, indem es sich den Dateinamen ansieht. Auch wenn ich dieses Skript ausführe, erhalte ich "mehrdeutige Weiterleitung"

#!/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
quelle
Wie nennt man dieses Skript?
Hauke ​​Laging
mögliches Duplikat von Ambigous Redirect erledigt> $ 2
Hauke ​​Laging
@HaukeLaging, nein ist es nicht. Die Frage scheint etwas Nahes zu sein, aber nicht dasselbe
Romeo Ninov
@RomeoNinov Würde es Ihnen etwas ausmachen, den relevanten Unterschied zu erklären?
Hauke ​​Laging
@HaukeLaging Das Skript wird in einer .sh-Datei gespeichert. Ich tippe einfach ./myscript.sh
Herman Toothrot

Antworten:

19

1>>und 2>>sind Weiterleitungen für bestimmte Dateideskriptoren, in diesem Fall die Standardausgabe (Dateideskriptor 1) und der Standardfehler (Dateideskriptor 2).

Das Skript leitet also alle "Standard" -Nachrichten an ${jobout}und alle Fehlermeldungen an um ${joberr}. Mit >>in beiden Fällen bedeutet , dass alle Nachrichten an die jeweiligen Dateien angehängt werden.

Beachten Sie dies ${jobout}und ${joberr}übernehmen Sie deren Werte aus den beiden Befehlszeilenparametern in das Skript ( ${1}und ${2}). Sie müssen daher die Dateien angeben, die zum Speichern der Nachrichten verwendet werden sollen. Wenn die Parameter nicht angegeben werden, erzeugt das Skript die Fehlermeldung "Mehrdeutige Umleitung", die Sie gesehen haben. Das Skript sollte wirklich prüfen, ob die Parameter angegeben wurden und ansonsten eine entsprechende Fehlermeldung ausgeben, etwa

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

am Anfang des Skripts.

Stephen Kitt
quelle
2

In Ihrem Fall 1 >> hängen Sie die Informationen des aktuellen stdout-Handlers an die Datei $ {jobout} an 2 >> hängen Sie die Informationen des aktuellen stderr-Handlers an die Datei $ {joberr} an

jobout und joberr sind Dateien, die als erster und zweiter Parameter des Skripts definiert sind

Romeo Ninov
quelle
1

Da es keine Parameter in den Aufruf des Skripts , die Parameter sind $1und $2leer sind und so sind $joboutund $joberr.

Sie müssen das Skript folgendermaßen aufrufen:

./myscript.sh file1 file2
Hauke ​​Laging
quelle
Parameternummern haben nichts mit den Nummern vor >>Umleitungsoperatoren zu tun .
Barmar
Egal, ich sehe, dass Sie den Teil über die mehrdeutige Weiterleitung beantworten, nicht die Frage im Titel. Sie sollten Ihre Antwort wahrscheinlich klarer machen.
Barmar