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
bash
shell-script
io-redirection
Herman Toothrot
quelle
quelle
Antworten:
1>>
und2>>
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, etwaam Anfang des Skripts.
quelle
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
quelle
Da es keine Parameter in den Aufruf des Skripts , die Parameter sind
$1
und$2
leer sind und so sind$jobout
und$joberr
.Sie müssen das Skript folgendermaßen aufrufen:
quelle
>>
Umleitungsoperatoren zu tun .