$ source /etc/environment
$ Sudo source /etc/environment
[Sudo] password for t:
Sudo: source: command not found
bash
とは異なるシェルがsource /etc/environment
を実行するために実行されており、シェルにはsource
が組み込まれていないようです。
しかし、私とルートのデフォルトのシェルはどちらもbash
です。
$ echo $Shell
/bin/bash
Sudo
が実際に別のシェルを使用しているのはなぜですか? slm's reply を見ましたが、私の場合はわかりません。
source
はシェルの組み込みなので、シェルなしでは実行できません。ただし、デフォルトでは、Sudo
はシェルを実行しません。から Sudo
プロセスモデル
Sudoがコマンドを実行すると、fork(2)が呼び出され、前述のように実行環境がセットアップされ、子プロセスでexecveシステムコールが呼び出されます。
シェルを明示的に実行する場合は、-s
オプションを使用します。
# Sudo -s source /etc/environment
シェルを終了すると、環境の変更が失われるため、これはまだ役に立ちません。
質問に答えるのではなく問題を解決する の領域で、rootだけが読み取ることができるファイルをソースする最も明白な(私にとって)方法は次のとおりです。
source <(Sudo cat /etc/environment)
これは プロセス置換 を使用します。 cat
コマンドの出力を受け取り、それをsource
に渡すことができる疑似ファイルに変換します。次に、ソースは現在のシェルでコマンドを実行します。
ほとんどのシステムでは、/etc/environment
は誰でも読めるので、これを実行するだけでべきです:
source /etc/environment
Sudo
はコマンドを想定していますが、Shellビルトインを提供しているため、コマンドを見つけることができません。 type source
と書くと、出力source is a Shell builtin
が表示され、which source
の出力は空になります。
たとえば、straceはコマンドであるため、Sudo strace
は機能し、which strace
は出力を提供します。
編集:また、Sudo su;Sudo source /etc/environment
が適切に機能するため、別のシェルは使用されていません。