Am următorul script bash, din ceea ce înțeleg >> este folosit pentru a atașa ieșirea unei comenzi la un fișier existent în loc de suprascriere, dar ce se descurcă în acest caz? Acest script apelează unele fișiere exe pentru a converti de la un format la altul. Există mulți ani pentru fiecare fișier, deci parcurge fiecare fișier uitându-se la numele fișierului. De asemenea, când rulez acest script, primesc „redirecționare ambiguă”
#!/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
Comentarii
- Cum faci numiți acest script?
- posibil duplicat al Redirecționare ambiguă efectuată > $ 2
- @HaukeLaging, nu, nu este. Întrebarea pare să fie despre ceva apropiat, dar nu același lucru
- @RomeoNinov V-ar deranja să explicați diferența relevantă?
- @HaukeLaging scriptul este salvat într-un fișier .sh. Tastez doar ./myscript.sh
Răspuns
1>>
și 2>>
sunt redirecționări pentru descriptori de fișiere specifici, în acest caz ieșirea standard (descriptorul de fișier 1) și eroarea standard (descriptorul de fișier 2).
Deci scriptul redirecționează toate mesajele „standard” către ${jobout}
și toate mesajele de eroare către ${joberr}
. Utilizarea >>
în ambele cazuri înseamnă că toate mesajele sunt atașate fișierelor respective.
Rețineți că ${jobout}
și ${joberr}
își ia valorile din cei doi parametri din linia de comandă către script (${1}
și ${2}
) , deci trebuie să specificați fișierele pe care doriți să le utilizați pentru a stoca mesajele. Dacă parametrii nu sunt dați, scriptul va produce mesajul de eroare „redirecționare ambiguă” pe care l-ați văzut; scriptul ar trebui să verifice dacă parametrii au fost furnizați și să producă un mesaj de eroare adecvat în caz contrar, ceva de genul
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
la începutul scriptului.
Răspuns
În cazul dvs. 1 >> adăugați informațiile din handler-ul curent stdout la fișierul $ {jobout} 2 >> adăugați informațiile de la stderr handler curent la fișierul $ {joberr}
jobout și joberr sunt fișiere, definite ca primul și al doilea parametru al scriptului
Răspuns
Deoarece nu există parametri în apelarea scriptului, parametrii $1
și $2
sunt goi și la fel sunt $jobout
și $joberr
.
Trebuie să apelați scriptul astfel:
./myscript.sh file1 file2
Comentarii
- Numerele parametrilor nu au nimic de-a face cu numerele dinaintea
>>
operatorilor de redirecționare . - Nu contează, vă văd ' răspunzând la partea despre redirecționarea ambiguă, nu la întrebarea din titlu. Probabil că ar trebui să vă clarificați răspunsul în legătură cu acest lucru.