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 и ненулевой выходной статус, если файл не найден.
Пожалуйста, не поддерживайте [бесполезное использование ls] (http://partmaps.org/era/unix/award.html#ls). –
Я думаю, что предоставление быстрого решения * и * предпочтительная альтернатива лучше, чем убегать от ужаса, по крайней мере, некоторое время. В этом случае, например, возможно, OP узнает о перенаправлении stderr и '$?', Даже если его использование 'ls' неверно. –
Правда. 'find' - не самая простая альтернатива. Простой тест почти достаточно. –