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


54

私はbashのデフォルトプロファイルの一部を更新してきましたが、以下を使用して、新しいプロファイルを新しい環境設定でリロードできることをチュートリアルで確認しました。

source /etc/bash.bashrc

唯一のこと-新しい環境変数は現在のユーザーのみが利用可能でした-sudoを使用した場合は無視されました。ターミナルセッションを閉じて再び参加したときにのみ、sudoで使用できるようになりました。

私が使用しようとすると:

sudo source /etc/bash.bashrc

エラーが表示されます:

sudo: source: command not found

ターミナルを閉じて再起動することなく、sudoの新しいbashプロファイル設定をロードする簡単な方法はありますか?

-最初は、変数を参照するインストーラスクリプトを使用していました。スクリプトを直接呼び出したときに変数にアクセスできる一方で(rootになる必要があるため、ディレクトリを作成する際に問題が発生します)、sudoを使用してインストールスクリプトを呼び出すことはできません。

これらの簡単なコマンドでテストすることでこれを証明しました。

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

最初のものは変数の値を出力しますが、2番目のものは何も出力しません。


sudoの変数をどのように使用しようとしましたか?「sudo command $ variable」を使用すると、sudoの環境からではなく、シェルから変数が置き換えられることに注意してください。
ジョアンピント

回答:


72

問題はsource、bashビルトインコマンド(プログラムではなく、lsまたはgrep)です。1つのアプローチは、rootとしてログインしてからsourceコマンドを実行することだと思います。

sudo -s
source /etc/bash.bashrc

3
問題は、それsourceがシェル組み込みであるということです。sudo suこれは一種の奇妙な言い方sudo -sです。sudoが「このユーザーとしてシェルを起動する」というsudo独自の方法であると言う方がいいです。1行のバージョンは機能しません。その中の各コマンドは、メインユーザーのシェルによって個別のサブプロセスで実行されるためです。
プーリー

1
右。さらに、BASHはログイン時に/ etc / bashrcを読み取ります。そのため、そのユーザーの環境を取得するために、-、-l、または--loginスイッチで 'su'を使用することもできます: 'sudo su-'はrootになるか、 'su-$ username'は別のユーザーになります。

「1行」の例はsu、新しいシェルを開始し、「ソース」が終了した後にのみ実行されるため、機能しません。最初の例は、ルートシェル内で 2行目が使用さている場合にのみ機能します。
loevborg

sudo -sは、より良いですsudo su。どちらの方法でも効果はありません。
loevborg

1
sudo -sシェルを起動するのと同様の効果がありますが、私にとっては、2つの「別のユーザーになる」コマンドを1つ実行するとスタックするのはエレガントではないようです。
プーリー

14

問題はsource、シェルの組み込みコマンドではありません。それが実際にあなたにcommand not foundエラーを投げているものであるという事実ですが、それがあったとしてもそれが機能するというわけではありません。

実際の問題は、環境変数がどのように機能するかです。そして、これらは次のように機能します。新しいプロセスが開始されるたびに、何も起こらない場合は、親の環境を継承します。このため、サブシェルを使用して(bashbashインスタンス内に入力するなど)、出力を確認envすると、親と同様の結果が得られます。

しかし、どのように伴うsudo工事(そのmanページに記載されているように)、sudoはコマンドの実行が実行され、その結果、ユーザーの環境を除去し、取って代わるユーザーのために、「デフォルト」の環境を作成しようとするかのようにそれを起動したユーザが持っていました呼び出し元のユーザー(これは予想される動作)であり、nautilusを実行sudo nautilusします。フォルダーでは/rootなく、フォルダーでフォルダーを開く必要があります/home/yourusername

そう:

sudo source script.shand thenのようなことを行うとsudo command、たとえそれが機能したとしても、変数をlaterに設定することに成功しませんsudo command

環境変数を渡すには、sudoに環境を保存するように指示し(-Eスイッチを使用し、sudoersファイルに適切な権限を付与する)、コマンドにとして設定しsudo VAR1=VALUE1 VAR2=VALUE2 commandます。


4

bash プロセス置換を使用すると、次のことができます。

source <(sudo cat /etc/bash.bashrc)

1
これは新しい設定でルートシェルを起動するのにどのように役立ちますか?これはOPが何をしようとしているのですか?
-muru

1
OPは、実際にsudo、プロファイルにアクセスするために使用する必要があるシェルから「...新しいプロファイルをリロードする...」方法を尋ねていました。上記は、上記のsudo: source: command not found問題を回避しながら、プロファイルをインポートする手段を提供します。
TomDotTom

「唯一のことは、新しい環境変数は現在のユーザーのみが利用可能であり、sudoを使用した場合は無視されたということです。」
ムル

3

以下のようマルコスが言い、ここにあなたの主な問題は、それがあるsource中、それの実行のみシェルプロセスに影響を与え、シェル組み込みコマンドです。

簡単な解決策は、ルートとして新しいシェルを起動するだけで、bashは起動/etc/bash.bashrc時に自動的に読み取ります。それは言うだけで簡単です

sudo bash

2

ターミナルを閉じて再度開いても、状況は変わりません。デフォルトでは、sudoは環境を削除します。これを無効にするには、sudoに-Eを追加します。


2

このエラーは、コマンドラインから呼び出そうとしているバイナリが現在のユーザーのPATH変数の一部であり、ルートユーザーのPATHの一部ではないために発生します。

これを確認するには、アクセスしようとしているバイナリのパスを見つけます。私の場合、「bettercap-ng」と呼ぼうとしていました。だから私は走った、

$ which bettercap-ng
/home/user/work/bin/bettercap`

この場所がルートユーザーのPATHの一部であるかどうかを確認しました。

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

そのため、sudoは、コマンドラインから呼び出しようとしているバイナリを見つけることができません。したがって、見つからないエラーコマンドを返します。

以下のようなバイナリを呼び出すときに、sudoに現在のユーザーのPATHを使用するように指示できます。

sudo -E env "PATH=$PATH" [command] [arguments]

実際、エイリアスを作成できます:

alias mysudo='sudo -E env "PATH=$PATH"'

エイリアス自体にsudoという名前を付けて、元のsudoを置き換えることもできます。

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