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