Mam następujący skrypt bash, z tego, co rozumiem, >> służy do dołączania danych wyjściowych polecenia do istniejącego pliku zamiast nadpisywania, ale co czy to robi w tym przypadku? Ten skrypt wywołuje niektóre pliki exe w celu konwersji z jednego formatu na inny. Każdy plik ma wiele lat, więc przegląda każdy plik w pętli, sprawdzając jego nazwę. Również po uruchomieniu tego skryptu pojawia się „niejednoznaczne przekierowanie”
#!/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
Komentarze
- Jak się masz wywołać ten skrypt?
- możliwy duplikat Niejednoznaczne przekierowanie wykonane > $ 2
- @HaukeLaging, nie, nie jest. Pytanie wydaje się dotyczyć czegoś bliskiego, ale nie tego samego
- @RomeoNinov Czy mógłbyś wyjaśnić istotną różnicę?
- @HaukeLaging skrypt jest zapisywany w pliku .sh. Po prostu wpisuję ./myscript.sh
Odpowiedź
1>>
i 2>>
to przekierowania do określonych deskryptorów plików, w tym przypadku standardowe wyjście (deskryptor pliku 1) i błąd standardowy (deskryptor pliku 2).
A więc skrypt przekierowuje wszystkie „standardowe” wiadomości do ${jobout}
, a wszystkie komunikaty o błędach do ${joberr}
. Użycie >>
w obu przypadkach oznacza, że wszystkie wiadomości są dołączane do odpowiednich plików.
Pamiętaj, że ${jobout}
i ${joberr}
pobierają ich wartości z dwóch parametrów wiersza poleceń do skryptu (${1}
i ${2}
) , więc musisz określić pliki, których chcesz używać do przechowywania wiadomości. Jeśli parametry nie są podane, skrypt wygeneruje komunikat o błędzie „niejednoznacznego przekierowania”, który widziałeś; skrypt powinien naprawdę sprawdzić, czy parametry zostały podane i wygenerować odpowiedni komunikat o błędzie, w przeciwnym razie, np.
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
na początku skryptu.
Odpowiedź
W twoim przypadku 1 >> dołącz informacje z bieżącego programu obsługi standardowego wyjścia do pliku $ {jobout} 2 >> dołącz informacje z aktualnego programu obsługującego stderr do pliku $ {joberr}
jobout i joberr to pliki, zdefiniowane jako pierwszy i drugi parametr skryptu
Odpowiedź
Ponieważ nie ma parametrów przy wywoływaniu skryptu, parametry $1
i $2
są puste i tak samo $jobout
i $joberr
.
Musisz wywołać skrypt w ten sposób:
./myscript.sh file1 file2
Komentarze
- Numery parametrów nie mają nic wspólnego z liczbami przed
>>
operatorami przekierowania . - Nieważne, widzę, że ' odpowiadasz na część dotyczącą niejednoznacznego przekierowania, a nie na pytanie w tytule. Prawdopodobnie powinieneś wyjaśnić swoją odpowiedź na ten temat.