Pourquoi “sudo cd” ne fonctionne-t-il pas?

Réponses:

56

cdest un shell intégré. sudone fonctionne qu'avec les exécutables. Vous pouvez le faire, sudo sh -c 'cd dirname'mais dès que le shell se ferme, vous revenez au répertoire de départ. Si vous dites ce que vous essayez d'accomplir, je peux vous aider à trouver un moyen de le faire.

Dennis Williamson
la source
2
Mais alors sudo pwdne fonctionnerait pas non plus? (J'ai toujours pensé que le sudo cd fait le travail, mais vous êtes tout simplement pas voir le résultat après les sudoretours. Mais c'était juste une supposition sauvage. Peut - être ni cdne pwdsont en fait intégré dans Bash sur un Mac course. which cd Ne me donne en effet des résultats. Course à pied sudo cd /ne me donne pas d'erreur, mais n'entraîne effectivement pas de modification du répertoire de travail.)
Arjan le
2
@Arjan: pwdest également un exécutable externe, donc cela fonctionnera. Notez que sur certains systèmes, il existe un cdexécutable, mais il est généralement inutile. Essayez d'utiliser type -a cdc'est beaucoup plus informatif que which, en passant.
Dennis Williamson le
2
Agréable! type -a cdmontre à la fois cd is a shell builtinet cd is /usr/bin/cdsur mon Mac. Et de même pour pwdet echo. Et à la fois sudo pwdet sudo echo "Hello world"ne me donner un résultat. Cependant, type -a returnseuls les rendements return is a shell builtin, et sudo return 3me montre sudo: return: command not found. Donc, je suppose que la question est la suivante: l’opérateur reçoit-il un message d’erreur ou ne voit-il pas le cdtravail sans erreur? (Ou: quel système d’exploitation utilise le PO.)
Arjan le
sudo sh -c 'cd dirname'ne fait rien pour moi.
Peter Niederwieser
1
@Arjan, j'ai trouvé l'explication: c'est un peu comme un piratage de compatibilité profond. Il ne fait pas sa fonction, mais il est venu des effets secondaires que le réel cda. Et il ne peut rien faire au lieu d’échouer lorsque le shell actuel n’a pas de cdcommande. Toute coquille pouvant être utilisée par des humains l’a cdnotamment /bin/sh. Mais un programme qui, vu depuis le noyau du système d’exploitation, est un shell peut être beaucoup plus simple, même avec seulement quelques lignes de code. Voir Quel est le point de la cdcommande externe?
Volker Siegel
72

Au lieu de cela, essayez d'utiliser sudo -spour démarrer un shell racine, puis simplement cddans le répertoire.
Lorsque vous avez terminé en tant que root, appuyez sur CtrlDou tapez exit.


Comme Arjan l'indique dans son commentaire ci-dessous, il est important de noter qu'en tant que root, on peut facilement endommager les composants essentiels du système. A utiliser avec précaution!

oKtosiTe
la source
4
Mais: faites attention, une fois que vous êtes root ...
Arjan le
7

Vous pouvez simplement sudevenir root et ensuite cdtout ce que vous voulez ... Je sais qu'une réponse a déjà été acceptée, mais si elle ne figure pas sur la liste des sudoers, c'est la seule option.

Alex
la source
D'autre part, s'il n'y a pas de mot de passe root ou si vous ne le connaissez pas, sudo est la seule option.
Liam
0

Selon votre système d'exploitation, cela "ne fonctionnera pas" de deux manières:

  1. Si votre système d'exploitation suit POSIX, l'exécution sudo cdentraînera l' exécution de la commande externe "cd" (située généralement sur /usr/bin/cd) dans un processus créé en tant qu'utilisateur root. Ce processus change les répertoires avec succès. Une fois ce processus terminé, vous serez renvoyé à votre shell habituel, qui se trouve toujours dans le répertoire où il a commencé.

    Donc sudo cdfonctionne sans erreur, mais ne change pas le répertoire de travail actuel de votre shell actuel.

    (référence: cette réponse )

  2. Sinon, l'exécution sudo cdentraînera ce qui suit. Votre ordinateur recherchera dans votre PATH un exécutable nommé "cd". Il n'en trouvera pas un. (Seule la commande intégrée "cd" du shell existe et il ne s'agit pas d'un fichier exécutable). Par conséquent, vous obtenez une erreur. (Sur Ubuntu, je reçois le message d'erreur sudo: cd: command not found.)

    Donc, sudo cdfonctionne avec erreur.

mareoraft
la source