$ 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の返信しかし、私の場合は理解できません。
答え1
source
シェル組み込み関数なので、シェルがなければ実行できません。ただし、シェルはデフォルトでは実行されませんsudo
。 ~からsudo
プロセスモデル
sudoは、コマンドを実行するときにfork(2)を呼び出し、上記のように実行環境を設定し、サブプロセスでexecveシステムコールを呼び出します。
シェルを明示的に実行するには、-s
次のオプションを使用します。
# sudo -s source /etc/environment
シェルを終了すると、環境の変更が失われるため、まだ機能しません。
答え2
その地域で質問に答えるのではなく、問題を解決してください。これは、ルートのみを読み取ることができるファイルを取得する最も確実な方法です。
source <(sudo cat /etc/environment)
これは以下を使用します。プロセスの交換。コマンドの出力を取得し、cat
擬似ファイルに変換します。このファイルをsource
.source に渡し、現在のシェルでコマンドを実行できます。
ほとんどのシステムでは/etc/environment
誰でも読めるのでしなければならないこれを実行できました:
source /etc/environment
答え3
sudo
コマンドが必要ですが、組み込みシェルを提供したため、コマンドが見つかりませんでした。type source
:を書くと出力が表示され、source is a shell builtin
出力はwhich source
空です。
たとえば、strace はコマンドなので、動作し、sudo strace
出力を提供します。which strace
sudo su;sudo source /etc/environment
編集:またうまくいくので、他のシェルが使用されていないことがわかります。