Minulla on seuraava bash-komentosarja, josta ymmärrän >> käytetään komennon lähdön liittämiseen olemassa olevaan tiedostoon korvaamisen sijaan, mutta mitä tekeekö se tässä tapauksessa? Tämä komentosarja kutsuu joitain exe-tiedostoja muunnettavaksi muodosta toiseen. Kullekin tiedostolle on monta vuotta, joten se selaa tiedostoja läpi katsomalla tiedostonimeä. Myös kun suoritan tämän komentosarjan, saan ”epäselvän uudelleenohjauksen”
#!/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
kommentit
- Kuinka voit kutsutaan tätä komentosarjaa?
- mahdollinen kopio Ambigous uudelleenohjaus tehty > $ 2
- @HaukeLaging, ei se ei ole. Kysymys näyttää olevan jotain läheisestä, mutta ei samasta.
- @RomeoNinov Haluatko selittää asiaankuuluvan eron?
- @HaukeLaging komentosarja tallennetaan .sh-tiedostoon. Kirjoitan vain ./myscript.sh
vastaus
1>>
ja 2>>
ovat uudelleenohjauksia tietyille tiedostokuvaajille, tässä tapauksessa vakiotuloste (tiedostokuvaaja 1) ja vakiovirhe (tiedostokuvaaja 2).
Joten komentosarja ohjaa kaikki ”tavalliset” viestit osoitteeseen ${jobout}
ja kaikki virheilmoitukset ${joberr}
. Käyttämällä >>
molemmissa tapauksissa kaikki viestit liitetään vastaaviin tiedostoihin.
Huomaa, että ${jobout}
ja ${joberr}
vievät arvot komentoriviparametreista komentosarjaan (${1}
ja ${2}
) , joten sinun on määritettävä tiedostot, joita haluat käyttää viestien tallentamiseen. Jos parametreja ei anneta, komentosarja tuottaa ”epäselvän uudelleenohjauksen” -virhesanoman, jonka olet nähnyt; komentosarjan tulisi todella tarkistaa, onko parametrit annettu, ja tuottaa muuten asianmukainen virheilmoitus, esimerkiksi
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
komentosarjan alussa. >
Vastaa
Sinun tapauksessasi 1 >> liitä nykyisen vakiokäsittelijän tiedot tiedostoon $ {jobout} 2 >> lisää tiedot nykyisestä stderr-käsittelijästä tiedostoon $ {joberr}
joboutr ja joberr ovat tiedostoja, jotka on määritelty komentosarjan ensimmäiseksi ja toiseksi parametriksi
Vastaus
Koska komentosarjan kutsumisessa ei ole parametreja, parametrit $1
ja $2
ovat tyhjiä ja niin ovat $jobout
ja $joberr
.
Sinun on kutsuttava komentosarjaa näin:
./myscript.sh file1 file2
kommentit
- Parametrinumeroilla ei ole mitään tekemistä
>>
uudelleenohjausoperaattoreita edeltävien numeroiden kanssa . - Ei väliä, näen ' vastaavan epäselvää uudelleenohjausta koskevaan osaan, ei otsikossa olevaan kysymykseen. Sinun pitäisi todennäköisesti tehdä vastauksestasi selvempi tästä.