Тест оболочки всегда завершается
Я новичок в оболочке, в настоящее время я написал небольшой скрипт, и у меня возникла проблема без каких-либо ошибок:/
Этот код всегда выходит из моего сценария, и я не понимаю, почему:
[[ -x $PATH ]] || log_failure_msg "Binary file not found or not executable!"; exit 0
Когда $PATH действителен, я ничего не получил, а если путь неправильный, я получил сообщение об ошибке.
Если я удалю log_failure_msg "Binary file not found or not executable!";
скрипт работает отлично -_-
Как я могу решить эту проблему без условий if/fi?
Спасибо за помощь!
2 ответа
Проблема в приоритете, как объяснили phlogratos. Тем не менее, вы не можете использовать круглые скобки, поскольку они порождают суб-оболочку, и вы выйдете из этой оболочки. Для этой конкретной проблемы существуют фигурные скобки. У них почти одинаковая семантика, но они порождают задания в текущей оболочке.
$ cat a.sh
[[ -f file ]] || { echo error; exit 0; }
echo "ok"
$ touch file
$ ./a.sh
ok
$ rm file
$ ./a.sh
error
$
[[ -x $PATH ]] || log_failure_msg "Binary file not found or not executable!"; exit 0
эквивалентно
{ [[ -x $PATH ]] || log_failure_msg "Binary file not found or not executable!" } ; exit 0
Что вам нужно
[[ -x $PATH ]] || { log_failure_msg "Binary file not found or not executable!"; exit 0 }
Я предполагаю, что вы используете Bash. Страница руководства bash гласит:
..., && and || have equal precedence, followed by ; and &, which have equal precedence.