«Sudo: source: commande introuvable»

15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Il semble qu'un shell différent de celui qui bashest exécuté pour s'exécuter source /etc/environmentet que le shell ne soit pas sourceintégré.

Mais mon et les shells par défaut de la racine sont les deux bash.

$ echo $SHELL
/bin/bash

Si sudoIndeeds utilise un shell différent, pourquoi? J'ai vu la réponse de slm , mais je ne comprends pas dans mon cas.

StackExchange pour tous
la source
4
sourceest un shell intégré .. vous ne pouvez pas utiliser sudopour exécuter un shell intégré comme une commande externe ..
heemayl
Le problème est-il que vous ne pouvez pas lire le fichier ou que vous souhaitez que l'environnement défini dans le fichier s'applique aux commandes sudo suivantes?
Random832
@ Random832: voulez que l'environnement défini dans le fichier s'applique aux commandes sudo suivantes
StackExchange for All

Réponses:

23

sourceest un shell intégré, il ne peut donc pas être exécuté sans le shell. Cependant, par défaut, sudon'exécutez pas shell. Desudo

Modèle de processus

Lorsque sudo exécute une commande, il appelle fork (2), configure l'environnement d'exécution comme décrit ci-dessus et appelle l'appel système execve dans le processus enfant

Si vous souhaitez exécuter explicitement le shell, utilisez l' -soption:

# sudo -s source /etc/environment

Ce qui est toujours inutile car après la fermeture du shell, les changements d'environnement sont perdus.

myaut
la source
7

Dans le domaine de la résolution du problème plutôt que de la réponse à la question , voici la manière la plus évidente (pour moi) de trouver un fichier que seul root peut lire:

source <(sudo cat /etc/environment)

Cela utilise la substitution de processus . Il prend la sortie de la catcommande et la transforme en un pseudo-fichier, auquel vous pouvez passer source. la source exécute ensuite les commandes dans le shell courant.

Notez que sur la plupart des systèmes, il /etc/environmentest lisible dans le monde entier, vous devriez donc pouvoir simplement exécuter ceci:

source /etc/environment
Kevin
la source
1
cela fonctionne, l'accepté ne fonctionne pas
Claudiu Creanga
2

sudoattend une commande mais vous donnez un shell intégré afin qu'il ne puisse pas trouver la commande. Si vous écrivez type source, vous pouvez voir la sortie:source is a shell builtin et la sortie de which sourceest vide.

Par exemple sudo strace cela fonctionnera et which stracedonnera une sortie car strace est une commande.

Edit: De plus, vous pouvez voir les sudo su;sudo source /etc/environmentœuvres bien, donc aucun shell différent n'est utilisé.

Esref
la source