Wat betekent 1 > > en 2 > >` bedoel in een bash-script?

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *