Як захопити повідомлення про помилку з виконаної команди?


20

Мені було доручено створити автоматизований сценарій загартовування сервера, і одне, що їм потрібно, - це звіт про всі результати кожної команди, що виконується. Я хочу зберігати повідомлення про помилку всередині рядка та додавати його до текстового файлу.

Скажімо, я виконував цю команду:

/sbin/modprobe -n -v hfsplus

Вихід із запуску цього в моїй машині буде:

FATAL: Module hfsplus not found

Як я можу зберігати це повідомлення про помилку всередині рядка? Будь-яка допомога буде дуже вдячна. Спасибі!


Я спробував запустити цю команду: var = $ (/ sbin / modprobe -n -v hfsplush) А потім відобразити її: $ var Але він все ще не фіксує повідомлення про помилку всередині рядка.
Мігель Роке

Відповіді:


23

це можна зробити, перенаправляючи команду про помилки:

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

як сценарій

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

або

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

якщо ви хочете додати помилку, використовуйте >>замість>

Не забудьте використовувати 2>&1та не 2> &1уникати помилки "синтаксична помилка біля несподіваного маркера` & '"


Я спробував такий підхід, і він зберігає його Прямо у текстовому файлі. Я хочу, щоб він зберігався спочатку в рядку, щоб я міг легко форматувати вміст.
Мігель Роке

1
@MiguelRoque дивіться оновлення
Networker

1
Я спробував поставити вихід у HEREDOC, і він також працював. Велике спасибі @Networker!
Мігель Роке

1
Хтось відмінив редагування, яке я зробив, тому що у мене була "помилка синтаксису біля &" та видалила пробіл після>. Виправдання було б добре.
Pierre.Sassoulas

Я спробував редагувати, оскільки: Не забудьте використовувати 2> & 1, а не 2> & 1, щоб уникнути помилки "помилка синтаксису поблизу несподіваного
маркера`

15

Просто зберегти як рядок у bash script:

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

Це може бути трохи краще, оскільки ви побачите повідомлення, коли виконується команда:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
Завжди використовуйте $ (команду) замість задніх клавіш для заміни команд. Краще :)
Sree

Я знаю, що це краще (у мене було менше проблем із використанням $ ()), але чому це так?
KolonUK

4

Я фіксую помилку, як це

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

якщо джерело не вдалося, я захоплюю помилку і запишу її.log_warn - це просто проста функція.

До речі, я використовую це у своїх точкових файлах


2

Для додавання до використання файлу /sbin/modprobe -n -v hfsplus 2>> filename


2

Новіші версії bash (Ie bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

Щоб повернути повідомлення про помилку у змінній, просто;

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

echo $error
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.