"Sudo: fuente: comando no encontrado"

15
$ source /etc/environment 

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

Parece que bashse ejecuta un shell diferente al que se ejecuta source /etc/environmenty ese shell no tiene sourcetan incorporado.

Pero mis y los shells predeterminados de la raíz son ambos bash.

$ echo $SHELL
/bin/bash

Si sudosangría usa un caparazón diferente, ¿por qué lo es? Vi la respuesta de slm , pero no entiendo en mi caso.

StackExchange para todos
fuente
44
sourcees una cáscara builtin..you no se puede utilizar sudopara ejecutar una orden interna del shell como un comando externo ..
heemayl
¿Es el problema que no puede leer el archivo o que desea que el entorno definido en el archivo se aplique a los siguientes comandos de sudo?
Random832
@ Random832: desea que el entorno definido en el archivo se aplique a los siguientes comandos de sudo
StackExchange for All

Respuestas:

23

sourcees un shell incorporado, por lo que no se puede ejecutar sin el shell. Sin embargo, de manera predeterminada, sudono ejecute shell. Desdesudo

Modelo de proceso

Cuando sudo ejecuta un comando, llama a fork (2), configura el entorno de ejecución como se describe anteriormente y llama a la llamada al sistema execve en el proceso secundario

Si desea ejecutar explícitamente shell, use la -sopción:

# sudo -s source /etc/environment

Lo que sigue siendo inútil porque después de salir del shell, se pierden los cambios del entorno.

myaut
fuente
7

En el ámbito de resolver el problema en lugar de responder la pregunta , esta es la forma más obvia (para mí) de obtener un archivo que solo la raíz puede leer:

source <(sudo cat /etc/environment)

Esto utiliza la sustitución de procesos . Toma el resultado del catcomando y lo convierte en un pseudoarchivo al que puede pasar source. fuente luego ejecuta los comandos en el shell actual.

Tenga en cuenta que en la mayoría de los sistemas, /etc/environmentes legible en todo el mundo, por lo que debería poder ejecutar esto:

source /etc/environment
Kevin
fuente
1
esto funciona, el aceptado no
Claudiu Creanga
2

sudoespera un comando pero le está dando un shell incorporado para que no pueda encontrar el comando. Si escribe type source, puede ver la salida: source is a shell builtiny la salida de which sourceestá vacía.

Por ejemplo sudo strace, funcionará y which stracedará salida porque strace es un comando.

Editar: Además, puede ver que sudo su;sudo source /etc/environmentfunciona bien, por lo que no se usa un shell diferente.

Esref
fuente