私はbashのデフォルトプロファイルの一部を更新しており、次のチュートリアルから、次を使用して新しい環境設定で新しいプロファイルをリロードできることを確認しました。
source /etc/bash.bashrc
唯一のことは-新しい環境変数は現在のユーザーのみが利用可能であり、Sudoを使用した場合は無視されたということです。ターミナルセッションを閉じて再参加したときにのみ、Sudoで使用できるようになりました。
私が使用しようとすると:
Sudo source /etc/bash.bashrc
エラーが表示されます:
Sudo: source: command not found
ターミナルを閉じて再起動することなく、Sudoの新しいbashプロファイル設定をロードする簡単な方法はありますか?
-最初は、変数を参照するインストーラスクリプトを使用していました。スクリプトを直接呼び出したときに変数にアクセスできましたが(ルートになる必要があるため、これによりディレクトリを作成するときに問題が発生します)、Sudoを使用してインストールスクリプトを呼び出すことはできませんでした。
これらの簡単なコマンドでテストすることでこれを証明しました。
echo $ENV_VARIABLE
Sudo echo $ENV_VARIABLE
最初のものは変数の値を出力しますが、2番目のものは何も出力しません。
問題は、source
がbashビルトインコマンド(ls
やgrep
などのプログラムではない)であることです。 1つのアプローチは、rootとしてログインしてからsourceコマンドを実行することだと思います。
Sudo -s
source /etc/bash.bashrc
問題は、source
がシェル組み込みコマンドであることではありません。 それが事実であるは、実際にcommand not found
エラーをスローしているものですが、それが機能していても機能するとは限りません。
実際の問題は、環境変数の仕組みです。そして、これらは次のように機能します。新しいプロセスが開始されるたびに、何も起こらない場合は、親の環境を継承します。このため、サブシェルを使用して(たとえば、bashインスタンス内でbash
と入力)、env
の出力を確認すると、その親と同様の結果が得られます。
ただし、Sudo
の動作方法(マンページに記載されている)により、Sudoはユーザーの環境を削除し、代替ユーザーの「デフォルト」環境を作成しようとするため、コマンドの実行が実行されますあたかもそれを呼び出したユーザーは呼び出しユーザー(これは予想される動作)であったため、Sudo nautilus
としてnautilusを実行すると、/root
ではなく、/home/yourusername
フォルダーにフォルダーが開かれます。
そう:
Sudo source script.sh
のようなことをしてからSudo command
を実行すると、たとえそれが機能したとしても、後のSudo command
に変数を設定することに成功しません。
環境変数を渡すには、Sudoに環境を保存するように指示し(-E
スイッチを使用し、sudoersファイルに適切な権限を付与する)、コマンドにSudo VAR1=VALUE1 VAR2=VALUE2 command
として設定します。
Marcosによる のように、ここでの主な問題は、source
が実行されるシェルプロセスのみに影響するシェル組み込みコマンドであることです。
簡単な解決策は、ルートとして新しいシェルを起動するだけで、bashは起動時に自動的に/etc/bash.bashrc
を読み取ります。それは言うだけで簡単です
Sudo bash
ターミナルを閉じて再度開いても、状況は変わりません。デフォルトでは、Sudoは環境を削除します。それを無効にするには、-EをSudoに追加します。
Bash プロセス置換 を使用すると、次のことができます。
source <(Sudo cat /etc/bash.bashrc)
このエラーは、コマンドラインから呼び出そうとしているバイナリが現在のユーザーの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が見つけることができません。したがって、見つからないエラーコマンドを返します。
以下のようなバイナリを呼び出すときに、現在のユーザーのPATHを使用するようにSudoに指示できます。
Sudo -E env "PATH=$PATH" [command] [arguments]
実際、エイリアスを作成できます:
alias mysudo='Sudo -E env "PATH=$PATH"'
エイリアス自体にSudoという名前を付けて、元のSudoを置き換えることもできます。