$ source /etc/environment $ sudo source /etc/environment [sudo] password for t: sudo: source: command not found
It seems that a different shell than bash is run to execute source /etc/environment and that shell doesn’t have source as builtin.
But my and the root’s default shells are both bash.
$ echo $SHELL /bin/bash
If sudo indeeds uses a different shell, why is it? I saw slm’s reply, but don’t understand in my case.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
source is a shell builtin, so it cannot be executed without the shell. However, by default, sudo do not run shell. From sudo
Process model
When sudo runs a command, it calls fork(2), sets up the execution environment as described above, and calls the execve system call in the child process
If you want to explicitly execute shell, use -s option:
# sudo -s source /etc/environment
Which is still useless because after shell is exited, environment changes are lost.
Method 2
In the realm of solving the problem rather than answering the question, here’s the most obvious (to me) way to source a file which only root can read:
source <(sudo cat /etc/environment)
This uses process substitution. It takes the output of the cat command and turns it into a pseudo-file, which you can pass to source. source then runs the commands in the current shell.
Note that on most systems, /etc/environment is world-readable, so you ought to be able to just run this:
source /etc/environment
Method 3
sudo expects a command but you are giving a shell builtin so it cannot find the command. If you write type source, you can see the output: source is a shell builtin and the output of which source is empty.
For example sudo strace will work and which strace will give output because strace is a command.
Edit: Also, you can see sudo su;sudo source /etc/environment works nicely so different shell is not used.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0