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!


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„ & ””


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

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



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
$ 

0

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

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

echo $error
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.