Co oznaczają „1 >>” i „2 >>” w skrypcie bash?

15

Mam następujący skrypt bash, z tego, co rozumiem, >> używa się do dołączenia wyniku polecenia do istniejącego pliku zamiast nadpisywania, ale co 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, patrząc na nazwę pliku. 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
Herman Toothrot
źródło
Jak nazwać ten skrypt?
Hauke ​​Laging
możliwy duplikat Ambigous przekierowanie wykonane> 2 $
Hauke ​​Laging
@HaukeLaging, nie, nie jest. Pytanie wydaje się dotyczyć czegoś bliskiego, ale nie tego samego
Romeo Ninov
@RomeoNinov Czy mógłbyś wyjaśnić istotną różnicę?
Hauke ​​Laging
@ HaukeLaging skryptu jest zapisany w pliku .sh. Po prostu wpisuję ./myscript.sh
Herman Toothrot

Odpowiedzi:

19

1>>i 2>>są przekierowaniami dla określonych deskryptorów plików, w tym przypadku standardowego wyjścia (deskryptor pliku 1) i standardowego błędu (deskryptor pliku 2).

Zatem skrypt przekierowuje wszystkie „standardowe” komunikaty ${jobout}i wszystkie komunikaty o błędach do ${joberr}. Użycie >>w obu przypadkach oznacza, że ​​wszystkie wiadomości są dołączane do odpowiednich plików.

Zauważ, że ${jobout}i ${joberr}przenieś 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żyć do przechowywania wiadomości. Jeśli parametry nie zostaną podane, skrypt wyświetli komunikat o błędzie „niejednoznaczne przekierowanie”; skrypt powinien naprawdę sprawdzić, czy parametry zostały podane, i w przeciwnym razie wygenerować odpowiedni komunikat o błędzie

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.

Stephen Kitt
źródło
2

W twoim przypadku 1 >> dołącz informacje z bieżącego modułu obsługi stdout do pliku $ {jobout} 2 >> dołącz informacje z bieżącego modułu obsługi stderr do pliku $ {joberr}

Jobout i Joberr są plikami, zdefiniowanymi jako pierwszy i drugi parametr skryptu

Romeo Ninov
źródło
1

Ponieważ nie istnieją żadne parametry w wywołanie skryptu parametry $1i $2są puste, a więc są $jobouti $joberr.

Musisz wywołać skrypt w następujący sposób:

./myscript.sh file1 file2
Hauke ​​Laging
źródło
Numery parametrów nie mają nic wspólnego z liczbami przed >>operatorami przekierowania.
Barmar
Nieważne, widzę, że odpowiadasz na część o niejednoznacznym przekierowaniu, a nie na pytanie w tytule. Prawdopodobnie powinieneś wyjaśnić swoją odpowiedź na ten temat.
Barmar,