Cosa significano `1 >>` e `2 >>` in uno script bash?


15

Ho il seguente script bash, da quello che ho capito >> è usato per aggiungere l'output 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 all'altro. Ci sono molti anni per ogni file, quindi scorre attraverso ogni file guardando il nome del file. Anche quando eseguo questo script ottengo un "reindirizzamento ambiguo"

#!/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

Come si chiama questo script?
Hauke ​​Laging,


@HaukeLaging, no non lo è. La domanda sembra riguardare qualcosa di simile, ma non lo stesso
Romeo Ninov,

@RomeoNinov Ti dispiacerebbe spiegare la differenza rilevante?
Hauke ​​Laging,

@HaukeLaging dello script viene salvato in un file .sh. Ho appena digitato ./myscript.sh
Herman Toothrot il

Risposte:


19

1>>e 2>>sono reindirizzamenti per descrittori di file specifici, in questo caso l'output standard (descrittore di file 1) e l'errore standard (descrittore di file 2).

Quindi lo script reindirizza tutti i messaggi "standard" a ${jobout}tutti i messaggi di errore ${joberr}. L'uso >>in entrambi i casi significa che tutti i messaggi vengono aggiunti ai rispettivi file.

Si noti che ${jobout}e ${joberr}prendere i loro valori dai due parametri della riga di comando allo script ( ${1}e ${2}), quindi è necessario specificare i file che si desidera utilizzare per archiviare i messaggi. Se i parametri non vengono specificati, lo script produrrà il messaggio di errore "reindirizzamento ambiguo" che hai visto; lo script dovrebbe davvero verificare se i parametri sono stati forniti e produrre altrimenti un messaggio di errore appropriato, qualcosa del genere

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

all'inizio della sceneggiatura.


2

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


1

Poiché non ci sono parametri nel chiamare lo script i parametri $1e $2sono vuoti e così sono $joboute $joberr.

Devi chiamare lo script in questo modo:

./myscript.sh file1 file2

I numeri dei parametri non hanno nulla a che fare con i numeri prima degli >>operatori di reindirizzamento.
Barmar,

Non importa, vedo che stai rispondendo alla parte sull'ambiguo reindirizzamento, non alla domanda nel titolo. Probabilmente dovresti rendere la tua risposta più chiara al riguardo.
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.