Jak przechwycić komunikat o błędzie z wykonanego polecenia?

20

Zadanie polegało mi na utworzeniu skryptu zautomatyzowanego serwera, a jednym z nich był raport wszystkich wyników każdego wykonanego polecenia. Chcę zapisać komunikat o błędzie w ciągu i dołączyć go do pliku tekstowego.

Powiedzmy, że uruchomiłem to polecenie:

/sbin/modprobe -n -v hfsplus

Wynikiem uruchomienia tego na moim komputerze byłoby:

FATAL: Module hfsplus not found

Jak mogę zapisać ten komunikat o błędzie w ciągu? Każda pomoc byłaby bardzo mile widziana. Dzięki!

Miguel Roque
źródło
Próbowałem uruchomić tę komendę: var = $ (/ sbin / modprobe -n -v hfsplush), a następnie wyświetliłem: $ var Ale nadal nie przechwytuje komunikatu o błędzie wewnątrz ciągu.
Miguel Roque

Odpowiedzi:

23

możesz to zrobić przekierowując polecenie error:

/sbin/modprobe -n -v hfsplus 2> fileName 

jako skrypt

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

lub

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

jeśli chcesz dołączyć błąd użyj >>zamiast>

Upewnij się, że używasz 2>&1i nie 2> &1omijasz błędu „błąd składni w pobliżu nieoczekiwanego tokena„ & ””

Networker
źródło
Wypróbowałem to podejście i zapisuje je BEZPOŚREDNIO w pliku tekstowym. Chcę, aby najpierw przechowywał się w ciągu, aby móc łatwo sformatować zawartość.
Miguel Roque
1
@MiguelRoque zobacz aktualizacje
Networker
1
Próbowałem umieścić wyjście w HEREDOC i zadziałało. Wielkie dzięki @Networker!
Miguel Roque
1
Ktoś cofnął edycję, którą zrobiłem, ponieważ miałem „błąd składni w pobliżu &” i usunąłem spację po>. Uzasadnienie byłoby miłe.
Pierre.Sassoulas,
Próbowałem edytować, ponieważ: Upewnij się, że używasz 2> i 1, a nie 2> i 1, aby uniknąć błędu „błąd składniowy w pobliżu nieoczekiwanego
tokena`
15

Wystarczy zapisać jako ciąg w skrypcie bash:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

Może to być nieco lepsze, ponieważ zobaczysz komunikaty po wykonaniu polecenia:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP
grafit
źródło
1
Zawsze używaj $ (polecenie) zamiast tylnych zwrotów do zastępowania poleceń. Lepiej :)
Sree
Wiem, że tak jest lepiej (miałem mniej problemów z używaniem $ ()), ale dlaczego tak jest?
KolonUK
4

Wychwytuję błąd w ten sposób

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

jeśli źródło nie powiedzie się, wychwycę błąd i zapiszę go. log_warn to tylko prosta funkcja.

BTW, używam tego w moich plikach dot

wener
źródło
2

Aby dołączyć do pliku użyj /sbin/modprobe -n -v hfsplus 2>> filename

harish.venkat
źródło
2

Nowsze wersje bash (tj. Bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 
BurningKrome
źródło
0

Aby zwrócić komunikat o błędzie w zmiennej, wystarczy;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
Jonathan
źródło