“Sudo: source: comando non trovato”


15
$ source /etc/environment 

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

Sembra che una shell diversa da bash viene eseguita per eseguire source /etc/environmente quella shell non abbia sourcecome builtin.

Ma le shell predefinite di my e root sono entrambe bash.

$ echo $SHELL
/bin/bash

Se sudoeffettivamente usa una shell diversa, perché? Ho visto la risposta di slm , ma non capisco nel mio caso.


4
sourceè una shell incorporata..non puoi usarla sudoper eseguire una shell incorporata come un comando esterno ..
heemayl

È il problema che non è possibile leggere il file o che si desidera che l'ambiente definito nel file si applichi ai successivi comandi sudo?
Casuale 832,

@ Random832: vuoi che l'ambiente definito nel file si applichi ai successivi comandi sudo
StackExchange per tutto

Risposte:


23

sourceè una shell incorporata, quindi non può essere eseguita senza la shell. Tuttavia, per impostazione predefinita, sudonon eseguire la shell. A partire dalsudo

Modello di processo

Quando sudo esegue un comando, chiama fork (2), imposta l'ambiente di esecuzione come descritto sopra e chiama la chiamata di sistema execve nel processo figlio

Se si desidera eseguire esplicitamente la shell, utilizzare l' -sopzione:

# sudo -s source /etc/environment

Che è ancora inutile perché dopo che la shell è uscita, le modifiche all'ambiente vengono perse.


7

Nel regno della risoluzione del problema piuttosto che della risposta alla domanda , ecco il modo più ovvio (per me) di ottenere un file che solo root può leggere:

source <(sudo cat /etc/environment)

Questo utilizza la sostituzione del processo . Prende l'output del catcomando e lo trasforma in uno pseudo-file a cui è possibile passare source. source quindi esegue i comandi nella shell corrente.

Nota che sulla maggior parte dei sistemi /etc/environmentè leggibile da tutti, quindi dovresti essere in grado di eseguire solo questo:

source /etc/environment

1
funziona, quello accettato no
Claudiu Creanga

2

sudosi aspetta un comando ma stai dando una shell incorporata in modo che non riesca a trovare il comando. Se scrivi type source, puoi vedere l'output: source is a shell builtine l'output di which sourceè vuoto.

Ad esempio sudo stracefunzionerà e which stracedarà output perché strace è un comando.

Modifica: Inoltre, puoi vedere che sudo su;sudo source /etc/environmentfunziona bene, quindi non viene utilizzata una shell diversa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.