Как захватить сообщение об ошибке от выполненной команды?


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, чтобы избежать ошибки "синтаксическая ошибка рядом с неожиданным токеном" & ""
peter_v

15

Просто хранить как строку в bash-скрипте:

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
Всегда используйте $ (command) вместо обратных галочек для подстановки команд. Это лучше :)
Sree

Я знаю, что это лучше (у меня было меньше проблем с использованием $ ()), но почему?
KolonUK

4

Я фиксирую ошибку вот так

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

если источник не удался, я улавливаю ошибку и записываю it.log_warn - простая функция.

Кстати, я использую это в моих точечных файлах



2

Более новые версии bash (т.е. 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.