2015-09-24 3 views
-2

Мне нужна ваша помощь в понимании этого поведения sudo.поведение команды sudo с котировками

sudo -s -- 'ls -l' Эта команда работает, но sudo 'ls -l' бросает ошибку говоря sudo: ls -l: command not found Я понимаю, что лечит всю строку в качестве цитаты одной команды (включая пробелы), но то, что я не получаю то, как это работает отлично с -s флагом, но терпит неудачу когда -s нет.

ответ

4

Без -s первым аргументом является имя команды для выполнения. С -s первым аргументом является строка, переданная в опцию -c любой оболочки ($SHELL или вашей системной оболочки), которая используется для выполнения аргумента.

То есть, если предположить $SHELL является sh, следующие условия эквивалентны:

sudo -s -- 'ls -l' 
sudo -- sh -c 'ls -l' 
+0

Вы можете написать 'sudo -" $ SHELL "-c 'ls -l'', чтобы избежать вашего предположения. –

+0

'-s' специально не подходит для' SHELL', поэтому я должен был что-то принять, и дать ему конкретное значение было проще. – chepner

+0

Ах, да - он держит ответ управляемо простым. Я снимаю свое предложение. –

2

Из sudo man page:

-s [команда]

Опция -s (оболочка) запускает оболочку, заданную в переменной окружения SHELL, если она установлена ​​или оболочки, как указано в базе данных паролей . Если задана команда, она передается в оболочку для выполнения через опцию -c оболочки. Если команда не указана , выполняется интерактивная оболочка.

Он ведет себя так, как будто это происходит потому, что создается новая оболочка, которая разбивает слова в вашей «цитируемой команде», как это делают shells.

+0

так без опции -s, его поведение команды SUDO рассматривать все упомянутое в кавычках, как одну команду. – chidori

+0

Исправить. Вы можете попробовать это самостоятельно в командной строке интерактивной оболочки, где '' ls -l "' выдаст ошибку 'ls -l: command not found', потому что оболочка буквально ищет путь к команде с пробелом в это, как вы это просили. – msw

Смежные вопросы