Почему не работает sudo cd?

Ответы:

56

cdэто встроенная оболочка sudoработает только с исполняемыми файлами. Вы можете сделать это, sudo sh -c 'cd dirname'но как только выйдет оболочка, вы вернетесь в каталог, из которого начали. Если вы говорите, что пытаетесь достичь, я могу помочь вам найти способ сделать это.

Деннис Уильямсон
источник
2
Но тогда sudo pwdтоже не сработает? (Я всегда полагал , что sudo cd делает работу, но вы просто не видите результат после sudoвозвращения. Но это была просто дикая догадка. Может быть , ни , cdни pwdна самом деле встроенный в Bash на Mac. Running which cd ли действительно дает мне результаты. Running sudo cd /не выдает ошибку, но действительно не приводит к изменению рабочего каталога.)
Arjan
2
@Arjan: pwdэто также внешний исполняемый файл, поэтому он будет работать. Обратите внимание, что в некоторых системах есть cdисполняемый файл, но он в основном бесполезен. Попробуйте использовать type -a cdэто гораздо более информативно, чем which, кстати.
Деннис Уильямсон
2
Приятно! type -a cdпоказывает как cd is a shell builtinи cd is /usr/bin/cdна моем Mac. И аналогично для pwdи echo. И как sudo pwdи sudo echo "Hello world"действительно дают мне результат. Однако type -a returnтолько уступает return is a shell builtinи sudo return 3показывает мне sudo: return: command not found. Итак, я предполагаю, что вопрос заключается в следующем: получает ли OP сообщение об ошибке или OP не видит cdработу без каких-либо ошибок? (Или: какую операционную систему использует OP.)
Arjan
sudo sh -c 'cd dirname'ничего не делает для меня
Питер Нидервизер
1
@Arjan Я нашел объяснение: это что-то вроде взлома глубокой совместимости. Он не выполняет свою функцию, но имеет побочные эффекты, которые cdимеет реальное . И он ничего не может сделать вместо того, чтобы потерпеть неудачу, когда текущая оболочка не имеет cdкоманды. Любая оболочка, которая может когда-либо использоваться людьми, имеет cd, в том числе /bin/sh. Но программа, которая, как видно из ядра операционной системы, является оболочкой, может быть намного проще, чем всего несколько строк кода. См. В чем смысл cdвнешней команды?
Фолькер Сигел
72

Вместо этого попробуйте использовать sudo -sдля запуска корневую оболочку, а затем просто cdв каталог.
Когда вы закончите как пользователь root, нажмите CtrlDили введите exit.


Как намекает Арджан в своем комментарии ниже, важно отметить, что, будучи root, можно легко нанести ущерб необходимым компонентам системы. Используйте с осторожностью!

oKtosiTe
источник
4
Но: будьте осторожны, если вы являетесь пользователем root
Arjan
7

Вы можете просто suстать пользователем root, а затем cdвсе, что вы хотите ... Я знаю, что ответ уже принят, но если его нет в списке sudoers, то это единственный вариант.

Alex
источник
С другой стороны, если нет пароля root или вы его не знаете, sudo - единственный вариант.
Лиам
0

Есть два способа, которыми он не будет работать, в зависимости от вашей ОС:

  1. Если ваша ОС следует POSIX, то запуск sudo cdприведет к выполнению внешней команды "cd" (обычно расположенной в /usr/bin/cd) в разветвленном процессе как пользователь root. Этот процесс успешно меняет каталоги. Как только этот процесс будет завершен, вы вернетесь в свою обычную оболочку, которая все еще находится в каталоге, где она началась.

    Так sudo cdработает без ошибок, но не меняет текущий рабочий каталог вашей текущей оболочки.

    (ссылка: этот ответ )

  2. В противном случае запуск sudo cdприведет к следующему. Ваш компьютер будет просматривать вашу PATH, пытаясь найти исполняемый файл с именем «cd». Он не найдет ни одного. (существует только встроенная команда оболочки "cd", и это не исполняемый файл). Следовательно, вы получаете ошибку. (В Ubuntu я получаю сообщение об ошибке sudo: cd: command not found.)

    Так sudo cdработает с ошибкой.

mareoraft
источник