=cmd
— это оператор расширения имени файла в zsh
, который расширяется до пути cmd
(, разрешенного поиском$PATH
). Если такая команда не найдена, это приводит к фатальной ошибке, например, когда глобусы не совпадают.
Итак, ==
здесь, в аргументе этой команды [
, просит оболочку найти команду =
в $PATH
, а zsh
говорит вам, что такой =
нигде нет.
$ echo =ls
/bin/ls
$ echo ==
zsh: = not found
$ install -m 755 /dev/null ~/bin/=
$ echo ==
/home/stephane/bin/=
Здесь либо используйте стандартный синтаксис для команды [
:
[ "$_user" = root ]
Или процитируйте=
:
[ "$_user" '==' root ]
Вам также понадобятся кавычки для сопоставления регулярных выражений:
[ "$_user" '=~' '^ro+t$' ]
В любом случае вы захотите процитировать $_user
, иначе вы получите какую-нибудь запутанную ошибку, когда $_user
пусто или не задано (и, что еще хуже, включая уязвимость ввода произвольной команды в Korn -, например оболочки. кромеzsh
(напримерbash
)).
Вы также можете отключить эту функцию, отключив параметр equals
(set +o equals
), который не очень полезен в сценариях.
Или используйте конструкциюksh
-стиля [[...]]
:
[[ $_user = root ]]
[[ $_user == root ]]
[[ $_user =~ '^ro+t$' ]]
Или case
конструкция:
case $_user in
(root)...
esac
([[ = ]]
, [[ == ]]
и case
выполняют сопоставление с шаблоном (подстановочный знак, а не регулярное выражение))
Обратите внимание, что это условное выражение, нет необходимости устранять неоднозначность между оператором присваивания и оператором равенства, поэтому нет необходимости в операторе ==
.
Похоже, приложения snap не позволяют легко отключить защиту AppArmor. К счастью, у Spotify для Linux была вторая версия пакета Debian, в которой не было такой проблемы. Технически не решено, но достаточно решено для меня!