Логический оператор «==» и zsh версии 5.7.x (установлен с помощью Homebrew)

  1. apt-get install sudo -y - Используется для установки пакета sudo в системах на базе Debian и y используется для указания да во время установки.
  2. yum install -y sudo - используется для установки пакета sudo в системах на базе Fedora, а y используется для указания да во время установки.
  3. echo "stack ALL = (ALL_ NOPASSWD: ALL" >> / etc / sudoers - Объединение строки stack ALL = (ALL_ NOPASSWD: ALL до конца / etc / sudoers файл.

По сути, вы устанавливаете пакет sudo для Debian или fedora ] и предоставив пользователю стек право запускать команды с sudo , добавив эту строку в файл / etc / sudoers .

{{ 1}}
2
21.02.2019, 15:57
3 ответа

Простой ответ :a ==является логическим оператором только внутри [[ … ]]конструкций.

$ [[ one == one ]] && echo "yes"
yes

И это работает также в ksh и bash.

При использовании вне [[ … ]]конструкции =cmd становится оператором расширения имени файла , но только в zsh

$ echo ==
zsh: = not found

Именно это происходит внутри более простой [ … ]конструкции, которую вы использовали.

Но правильный способ проверить, что пользователь, выполняющий сценарий оболочки, является пользователем root, это сделать:

if (( EUID == 0 )); then
    echo "root"
else
    echo "not root"
fi
4
27.01.2020, 21:58

=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выполняют сопоставление с шаблоном (подстановочный знак, а не регулярное выражение))

Обратите внимание, что это условное выражение, нет необходимости устранять неоднозначность между оператором присваивания и оператором равенства, поэтому нет необходимости в операторе ==.

5
27.01.2020, 21:58

Более короткий ответ по касательной.. возможно вы читали образец, созданный для работы под другим типом оболочки?

$ zsh -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
zsh:1: = not found

$ bash -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
equal!
1
27.01.2020, 21:58

Теги

Похожие вопросы