1

У меня есть команда, которая работает при запуске от имени текущего пользователя, но если я добавлю к команде префикс sudo , это выдаст мне ошибку.

Я пытаюсь удалить файл, если это каталог (но не если это символическая ссылка на каталог). Это прекрасно работает:

brad@ip-10-0-0-1:~$ [[ -d /path/to/my/place && ! -L /path/to/my/place ]] && rm -rf /path/to/my/place

Но если я пытаюсь использовать sudo чтобы сделать это как суперпользователь, я получаю сообщение об ошибке, потому что кажется, что sudo [[ это команда:

brad@ip-10-0-0-1:~$ sudo [[ -d /path/to/my/place && ! -L /path/to/my/place ]] && rm -rf /path/to/my/place
sudo: [[: command not found

Мне пришлось добавить двойные скобки, чтобы получить ! -L /path/to/my/place бит для работы; sudo работал нормально с одинарными скобками, когда я работал

brad@ip-10-0-0-1:~$ sudo [ -d /path/to/my/place ] && rm -rf /path/to/my/place

Но теперь, когда я пытаюсь убедиться, что это не символическая ссылка, я не могу заставить ее работать с sudo . Как я могу либо:

  • Получите синтаксис двойных скобок для работы с sudo или
  • Получить синтаксис с одной скобкой, чтобы я мог отменить часть -L ?

1 ответ1

1
$ 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 ] && …

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .