web-dev-qa-db-ja.com

「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's reply を見ましたが、私の場合はわかりません。

15
Tim

sourceはシェルの組み込みなので、シェルなしでは実行できません。ただし、デフォルトでは、Sudoはシェルを実行しません。から Sudo

プロセスモデル

Sudoがコマンドを実行すると、fork(2)が呼び出され、前述のように実行環境がセットアップされ、子プロセスでexecveシステムコールが呼び出されます。

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

# Sudo -s source /etc/environment

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

23
myaut

質問に答えるのではなく問題を解決する の領域で、rootだけが読み取ることができるファイルをソースする最も明白な(私にとって)方法は次のとおりです。

source <(Sudo cat /etc/environment)

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

ほとんどのシステムでは、/etc/environmentは誰でも読めるので、これを実行するだけでべきです

source /etc/environment
7
Kevin

Sudoはコマンドを想定していますが、Shellビルトインを提供しているため、コマンドを見つけることができません。 type sourceと書くと、出力source is a Shell builtinが表示され、which sourceの出力は空になります。

たとえば、straceはコマンドであるため、Sudo straceは機能し、which straceは出力を提供します。

編集:また、Sudo su;Sudo source /etc/environmentが適切に機能するため、別のシェルは使用されていません。

2
Esref