$ source /etc/environment
$ sudo source /etc/environment
[sudo] password for t:
sudo: source: command not found
Parece que bash
se ejecuta un shell diferente al que se ejecuta source /etc/environment
y ese shell no tiene source
tan incorporado.
Pero mis y los shells predeterminados de la raíz son ambos bash
.
$ echo $SHELL
/bin/bash
Si sudo
sangría usa un caparazón diferente, ¿por qué lo es? Vi la respuesta de slm , pero no entiendo en mi caso.
source
es una cáscara builtin..you no se puede utilizarsudo
para ejecutar una orden interna del shell como un comando externo ..Respuestas:
source
es un shell incorporado, por lo que no se puede ejecutar sin el shell. Sin embargo, de manera predeterminada,sudo
no ejecute shell. Desdesudo
Si desea ejecutar explícitamente shell, use la
-s
opción:Lo que sigue siendo inútil porque después de salir del shell, se pierden los cambios del entorno.
fuente
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:
Esto utiliza la sustitución de procesos . Toma el resultado del
cat
comando y lo convierte en un pseudoarchivo al que puede pasarsource
. fuente luego ejecuta los comandos en el shell actual.Tenga en cuenta que en la mayoría de los sistemas,
/etc/environment
es legible en todo el mundo, por lo que debería poder ejecutar esto:fuente
sudo
espera un comando pero le está dando un shell incorporado para que no pueda encontrar el comando. Si escribetype source
, puede ver la salida:source is a shell builtin
y la salida dewhich source
está vacía.Por ejemplo
sudo strace
, funcionará ywhich strace
dará salida porque strace es un comando.Editar: Además, puede ver que
sudo su;sudo source /etc/environment
funciona bien, por lo que no se usa un shell diferente.fuente