Вопрос по permissions, unix, shell – Как получить вывод ошибки и сохранить его в переменной или файле

3

У меня есть небольшая проблема с выяснением, как получить сообщение об ошибке и сохранить его в переменной или файле в ksh. Так что в моем сценарии у меня естьcp -p source.file destination внутриwhile петля.

Когда я получаю ошибку ниже

cp: source.file: The file access permissions do not allow the specified action.

Я хочу взять его и сохранить в переменной или файле.

Спасибо

Ваш Ответ

3   ответа
0

command 2> /path/to/file.txt
1

В ksh (согласно Q), как и в bash и других производных sh, вы можете получить весь / просто вывод stderr из cp с помощью перенаправления, а затем получить переменную var (используя $ (), лучше, чем backtick, если используется не совсем свежая версия) :

output=$(cp -p source.file destination 2>&1)

cp обычно не выводит ничего, хотя это захватывает stdout и stderr; чтобы захватить только stderr таким образом, используйте1>/dev/null также. Другие решения, перенаправляющие в файл, могут использовать cat / различные другие команды для вывода / обработки файла журнала.

Причина, по которой я не предлагаю использовать вывод во временные файлы:

Перенаправление в файл с последующим чтением в него (с помощью команды чтения или, более неэффективно, через$(cat file) ), особенно для одной строки, менее эффективен и медленнее; хотя не так уж и плохо, если вы хотите добавить к нему каждый раз для нескольких операций перед отображением ошибок. Вы также оставите временный файл рядом с собой, если вы ВСЕГДА не очистите его, не забудете, когда люди прерывают (т.е. Ctrl-C) или убивают сценарий.

Использование временных файлов также может быть проблемой, если скрипт запускается несколько раз за раз (например, это может произойти через cron, если файловая система / другие задержки вызывают массовые переполнения или просто у нескольких пользователей), если временное имя файла не является уникальным.

Генерация временных файлов также представляет собой угрозу безопасности, если не делать это очень осторожно, особенно если данные файла обрабатываются снова или содержимое может быть переписано перед отображением чего-либо еще, что может сбить с толку / обмануть пользователя / сломать сценарий. Не имейте привычки делать это слишком небрежно, сначала прочитайте временные файлы (например, mktemp) через другие вопросы здесь / google.

4

Вы можете перенаправить вывод ошибок команды следующим образом:

cp -p source.file destination 2>> my_log.txt

Это добавит сообщение об ошибке в файл my_log.txt.

Если вам нужна переменная, вы можете перенаправить stderr в stdout и назначить вывод команды переменной:

my_error_var=$(cp -p source.file destination 2>&1)

Похожие вопросы