Отображение пользовательской ошибки в bash - PullRequest
1 голос
/ 13 марта 2012

У меня есть эта строка в моем сценарии:

#Search process id files 
PID_FILE=$(ls $PROFILES_PATH*/*/*/*.pid )

Когда команда ls не находит файл, она показывает следующий вывод:

ls: *.pid: No such file or directory

Есть ли способ зафиксировать эту ошибку и показать вместо нее собственное сообщение об ошибке?

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Вы можете перенаправить stderr команды на /dev/null, а затем распечатать свое собственное сообщение об ошибке после проверки состояния выхода:

PID_FILE=$(ls $PROFILES_PATH*/*/*/*.pid 2>/dev/null)
[ $? != 0 ] && echo "Couldn't find PID."

В общем, я бы рекомендовал не использовать ls для этого,хоть.Вы, вероятно, должны использовать что-то вроде find $PROFILES_PATH -iname '*.pid'.

2 голосов
/ 13 марта 2012

Ls совершенно лишний.Оболочка просматривает файл при расширении шаблона, поэтому все, что нам нужно сделать, это:

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

Первая часть тривиальна с использованием test или псевдонима [.К сожалению, второй вариант немного нетривиален, поскольку один printf "%s" pattern не работает, поэтому приходится прибегать к вспомогательной функции, которая просто выводит свой первый аргумент.

Решение - написать короткую вспомогательную функцию оболочкинапример:

first() { printf "%s" "$1"; }
PID_FILE=$(first $PROFILES_PATH*/*/*/*.pid)
[ -f "$PID_FILE" ] || echo "Couldn't find PID."

В этом случае PID_FILE будет равен шаблону, если он не найден, а тест -f скажет вам, соответствует ли он.В качестве альтернативы вы можете переместить тест в вспомогательную функцию:

matches() { [ -f "$1" ] && printf "%s" "$1"; }
PID_FILE=$(matches $PROFILES_PATH*/*/*/*.pid)
[ $? != 0 ] && echo "Couldn't find PID."

Таким образом, вы все равно получаете пустой PID_FILE и ненулевой статус выхода, если файл не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...