Тест оболочки всегда завершается

Я новичок в оболочке, в настоящее время я написал небольшой скрипт, и у меня возникла проблема без каких-либо ошибок:/

Этот код всегда выходит из моего сценария, и я не понимаю, почему:

[[ -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.
Другие вопросы по тегам