Ho il seguente script bash, da quello che ho capito >> è usato per aggiungere loutput di un comando a un file esistente invece di sovrascriverlo, ma cosa sta facendo in questo caso? Questo script chiama alcuni file exe per la conversione da un formato allaltro. Ci sono molti anni per ogni file, quindi scorre ogni file guardando il nome del file. Inoltre, quando eseguo questo script ottengo “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
Commenti
- Come fai chiamare questo script?
- possibile duplicato di Reindirizzamento ambiguo eseguito > $ 2
- @HaukeLaging, no, non lo è. La domanda sembra riguardare qualcosa di vicino, ma non la stessa
- @RomeoNinov Ti dispiacerebbe spiegare la differenza rilevante?
- @HaukeLaging lo script viene salvato in un file .sh. Digito solo ./myscript.sh
Answer
1>>
e 2>>
sono reindirizzamenti per descrittori di file specifici, in questo caso lo standard output (descrittore di file 1) e lerrore standard (descrittore di file 2).
Quindi lo script reindirizza tutti i messaggi “standard” a ${jobout}
e tutti i messaggi di errore a ${joberr}
. Lutilizzo di >>
in entrambi i casi significa che tutti i messaggi vengono aggiunti ai rispettivi file.
Tieni presente che ${jobout}
e ${joberr}
trasferisce i propri valori dai due parametri della riga di comando allo script (${1}
e ${2}
) , quindi è necessario specificare i file che si desidera utilizzare per memorizzare i messaggi. Se i parametri non sono forniti, lo script produrrà il messaggio di errore “ambiguous redirection” che hai visto; lo script dovrebbe realmente verificare se i parametri sono stati forniti e produrre un messaggio di errore appropriato altrimenti, qualcosa come
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
allinizio dello script.
Risposta
Nel tuo caso 1 >> aggiungi le informazioni dal gestore stdout corrente al file $ {jobout} 2 >> aggiungi le informazioni dal gestore stderr corrente al file $ {joberr}
jobout e joberr sono file, definiti come primo e secondo parametro dello script
Risposta
Poiché non ci sono parametri nella chiamata dello script, i parametri $1
e $2
sono vuoti e così sono $jobout
e $joberr
.
Devi chiamare lo script in questo modo:
./myscript.sh file1 file2
Commenti
- I numeri dei parametri non hanno nulla a che fare con i numeri prima degli
>>
operatori di reindirizzamento . - Non importa, vedo che ' rispondi alla parte relativa al reindirizzamento ambiguo, non alla domanda nel titolo. Probabilmente dovresti rendere la tua risposta più chiara al riguardo.