Ik heb het volgende bash-script, van wat ik begrijp >> wordt gebruikt om de uitvoer van een commando aan een bestaand bestand toe te voegen in plaats van te overschrijven, maar wat doet het in dit geval? Dit script roept enkele exe-bestanden op om van het ene formaat naar het andere te converteren. Elk bestand heeft vele jaren, dus het loopt door elk bestand door naar de bestandsnaam te kijken. Ook wanneer ik dit script uitvoer, krijg ik “ambiguous redirect”
#!/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
Comments
- Hoe gaat het noem dit script?
- mogelijk duplicaat van Ambigous redirect gedaan > $ 2
- @HaukeLaging, nee dat is het niet. De vraag lijkt over iets dichtbij te gaan, maar niet hetzelfde.
- @RomeoNinov Zou je het erg vinden om het relevante verschil uit te leggen?
- @HaukeLaging het script wordt opgeslagen in een .sh-bestand. Ik typ gewoon ./myscript.sh
Antwoord
1>>
en 2>>
zijn omleidingen voor specifieke bestandsdescriptors, in dit geval de standaarduitvoer (bestandsdescriptor 1) en standaardfout (bestandsdescriptor 2).
Dus het script stuurt alle “standaard” berichten door naar ${jobout}
en alle foutmeldingen naar ${joberr}
. Het gebruik van >>
in beide gevallen betekent dat alle berichten worden toegevoegd aan de respectieve bestanden.
Merk op dat ${jobout}
en ${joberr}
nemen hun waarden over van de twee opdrachtregelparameters naar het script (${1}
en ${2}
) , dus u moet de bestanden specificeren die u wilt gebruiken om de berichten op te slaan. Als de parameters niet worden opgegeven, zal het script de “ambigue redirection” -foutmelding produceren die je hebt gezien; het script moet echt controleren of de parameters zijn opgegeven en anders een passende foutmelding geven, zoiets als
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
aan het begin van het script.
Antwoord
In jouw geval 1 >> voeg de informatie van de huidige stdout handler toe aan het bestand $ {jobout} 2 >> voeg de informatie toe van huidige stderr-handler naar het bestand $ {joberr}
jobout en joberr zijn bestanden, gedefinieerd als eerste en tweede parameter van script
Antwoord
Aangezien er geen parameters zijn bij het aanroepen van het script, zijn de parameters $1
en $2
leeg en dat geldt ook voor $jobout
en $joberr
.
Je moet het script als volgt aanroepen:
./myscript.sh file1 file2
Opmerkingen
- Parameternummers hebben niets te maken met de nummers vóór
>>
omleidingsoperatoren . - Maakt niet uit, ik zie dat je ' het deel over de dubbelzinnige omleiding beantwoordt, niet de vraag in de titel. U moet uw antwoord hierover waarschijnlijk duidelijker maken.