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


15
$ 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

sudoIndeedsが別のシェルを使用している場合、なぜですか?slmの返信を見ましたが、私の場合はわかりません。


4
sourcesudoシェル組み込みです。外部コマンドのようにシェル組み込みを実行するために使用することはできません
。– heemayl

ファイルを読み取れないという問題ですか、またはファイルで定義された環境を後続のsudoコマンドに適用したいですか?
Random832

Random832 @:ファイルに定義された環境は、後続のsudoコマンドに適用する
すべてのためのStackExchange

回答:


23

sourceはシェルに組み込まれているため、シェルなしでは実行できません。ただし、デフォルトでsudoは、シェルを実行しないでください。からsudo

プロセスモデル

sudoがコマンドを実行すると、fork(2)を呼び出し、上記のように実行環境を設定し、子プロセスでexecveシステムコールを呼び出します。

シェルを明示的に実行する場合は、-sオプションを使用します。

# sudo -s source /etc/environment

シェルを終了した後、環境の変更が失われるため、これはまだ役に立ちません。


7

質問答えるのではなく、問題解決する分野では rootのみが読み取れるファイルを入手する(私にとって)最も明白な方法を次に示します。

source <(sudo cat /etc/environment)

これはプロセス置換を使用しますcatコマンドの出力を受け取り、それを疑似ファイルに変換します。これはに渡すことができますsource。次に、sourceは現在のシェルでコマンドを実行します。

ほとんどのシステム上で、注意することを/etc/environment世界的に読み取り可能である、あなたはとてもべきちょうどこれを実行できるようにします:

source /etc/environment

1
この作品は、受け入れられた1にはない
クラウディウCreanga

2

sudoコマンドが必要ですが、コマンドが見つからないようにシェル組み込みコマンドを指定しています。を書くと、出力をtype source見ることができます:source is a shell builtinの出力which sourceは空です。

例えば、sudo strace動作するとwhich stracestraceのコマンドであるため、出力が得られます。

編集:また、sudo su;sudo source /etc/environment別のシェルが使用されていないので、うまく動作することがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.