Большинство «команд» в unix-подобной среде фактически являются внешними программами и скриптами. Несколько, например exit
, являются действительными командами, встроенными в оболочку. sudo
не может распознать последний.
От человека странице:
Когда Sudo запускает команду, она вызывает вилку (2), устанавливает выполнения среды, как описано выше, и вызывает системный вызов execve в Дочерний процесс.
На странице execve
человек:
execve() выполняет программу, на которую указывает имя файла.
Программа не указана exit
; это просто команда, которую оболочка распознает.
Подумайте об этом так: Unix предоставляет разрешения для процесса. sudo
запускает процесс с повышенными/измененными разрешениями. Но когда вы запустите exit
, вы не создадите новый процесс. sudo
не может поднять разрешения уже запущенной оболочки; так что бы это могло сделать?
Что нужно сделать, так это сообщить sudo
, чтобы создать другую оболочку, передав exit
как команду для запуска этой оболочки ... которая ничего не сделает, конечно.
'exit' - это не программа, это встроенная оболочка, вы также должны попробовать' echo --help' vs 'sudo echo --help'. Я думаю, что 'sudo' может только хотеть выполнить программу, а не оболочку встроенного – tforgione
кросс-сайта дубликата: http://askubuntu.com/questions/291666/why-doesnt-sudo-cd-var-named-work – Aserre
'sudo' * определенно * хочет исполняемый файл. – chepner