「sudo:ソース:コマンドが見つかりません」

「sudo:ソース:コマンドが見つかりません」
$ 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編集:またうまくいくので、他のシェルが使用されていないことがわかります。

関連情報