Я это понимаю
sudo cd /directory
вернется:
sudo: cd: command not found
потому что cd — это встроенная оболочка, а не двоичный файл. Но тогда почему
sudo echo 'this is a test'
работает отлично?
Что тут на самом деле происходит? Как sudo
найти команду, echo
если это не оболочка?
решение1
Причина проста: cd
это встроенная функция оболочки (и функция оболочки в некоторых оболочках), в то время как echo
является как двоичным файлом, так и встроенной функцией оболочки:
$ type -a cd
cd is a shell builtin
$ type -a echo
echo is a shell builtin
echo is /bin/echo
sudo
не может обрабатывать встроенные функции оболочки, но может обрабатывать двоичные файлы в $PATH
. Когда вы используете sudo echo
, /bin/echo
находится в $PATH
, поэтому он использует его, в то время как sudo cd
не может найти cd
в , $PATH
поэтому он терпит неудачу.
решение2
бег
which echo
дает
/bin/echo
echo
является простой программой и sudo
может «найти» ее.
Кстати, должен быть какой-то вариантsudoers(5)
решение3
Проблема скорее в sudo cd
неудаче вашей ОС, чем sudo echo
в успехе.
sudo cd /directory
root
вполне законный метод проверки , разрешен ли пользователю, вероятно, здесь, доступ cd
к некоторому каталогу. Вот почему все совместимые с Posix ОСделатьпредоставить исполняемую версию cd
.
Итак, ответ на ваш вопрос - sudo echo yo
работает по замыслу, поскольку echo
предоставляется как псевдонимом оболочки, так и исполняемой командой, но sudo cd /directory
не работает, потому что ваша ОС, скорее всего, основанная на Gnu/Linux, неисправна.стандарт Posixв данном конкретном случае.
Простым решением для вашей системы будет запускsudo sh -c "cd /directory"