2012-03-13 5 views
0

У меня есть эта линия в моем скрипте:Отображение пользовательских ошибок в Баш

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

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

ls: *.pid: No such file or directory 

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

ответ

3

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

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

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

+1

Пожалуйста, не поддерживайте [бесполезное использование ls] (http://partmaps.org/era/unix/award.html#ls). –

+0

Я думаю, что предоставление быстрого решения * и * предпочтительная альтернатива лучше, чем убегать от ужаса, по крайней мере, некоторое время. В этом случае, например, возможно, OP узнает о перенаправлении stderr и '$?', Даже если его использование 'ls' неверно. –

+0

Правда. 'find' - не самая простая альтернатива. Простой тест почти достаточно. –

2

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 и ненулевой выходной статус, если файл не найден.

Смежные вопросы