$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword $
Как вы можете видеть [
(помимо встроенной оболочки) это обычная команда, которую sudo
можно использовать. [[
не является. Вам необходимо bash
предоставить [[
:
sudo bash -c '[[ -d /path/to/my/place && ! -L /path/to/my/place ]]' && …
Поскольку [[
это ключевое слово оболочки, синтаксический анализатор распознает его и изменяет поведение &&
между [[
и ]]
. Вы не можете использовать &&
внутри, [ … ]
потому что [
действует как команда и ]
фактически является последним аргументом, переданным ей. Наличие &&
внутри означает, что есть две команды, что неправильно.
Однако [
поддерживает -a
, так что это может работать:
sudo [ -d /path/to/my/place -a ! -L /path/to/my/place ] && …
Вы должны избегать этого, хотя. Из этой статьи :
Двоичный файл
-a
и-o
[…] являются расширениями XSI стандарта POSIX. Все они помечены как устаревшие в POSIX-2008. Они не должны использоваться в новом коде. Одна из практических проблем с[ A = B -a C = D ]
(или-o
) состоит в том, что POSIX не указывает результаты командыtest
или[
с более чем 4 аргументами. Это, вероятно, работает в большинстве оболочек, но вы не можете рассчитывать на это. Если вам нужно писать для POSIX-оболочек, вам следует использовать двеtest
или[
команды, разделенные&&
оператором.
Так что это должно быть безопаснее, если вы хотите использовать [
:
sudo [ -d /path/to/my/place ] && sudo [ ! -L /path/to/my/place ] && …