シェルスクリプトから.bashrcを取得する方法

シェルスクリプトから.bashrcを取得する方法

script.sh次の行を含むbashスクリプトがあります。

sudo -u myusername sh ~/.profile

シェルから呼び出すことはできますが、source ~/.profileスクリプトでは機能しませんが、このコマンドは機能します。現在のシェルが私の内容を読むように強制します。~/.profile

しかし、私のコンテンツには~/.profile次の行が含まれています。

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

ただし~/.bashrc、これを実行すると、script.sh次のエラーが発生します。

/home/username/.profile: 24: /home/username/.profile: source: not found

myまたはmyを変更せずに~/.bashrcmy ~/.profile(別のスクリプトから呼び出されます)から自分のファイルをインポートできますか?~/.bashrc~/.profile

その後、script.sh私のファイル~/.profile~/.bashrcファイルがダウンロードされ、正しい場所に保存されます。したがって、script.shダウンロード後にこれらのファイルをインポートして実行するために使用するシェルセッションに影響を与えたいと思います。script.sh

ベストアンサー1

エラーは、理解できない実行可能~/.profileファイルを使用しようとしたときに発生します(代わりに他のすべてのPOSIXシェルでも機能する(ドット)を使用してください)。shsourcesh.bash

また、実行時に~/.profileファイルが実行されるシェルで設定する環境変数は設定されません。これは、独自のサブシェルで実行されるためです。

~/.profileサブシェル(取得ではなく実行時に取得するもの)は、親シェル(スクリプトを実行するシェル)の環境にはまったく影響しません。したがって、ファイルに変数を設定しないと、~/.profileその変数がスクリプトで設定されるとは期待できません。source

実行は現在シェルの子プロセスなので、sudo source ~/.profileここでは役に立ちません。sudo


関連する追加情報:

~/.profileインタラクティブシェル(ソース~/.bashrcコードの入手先)で実行されないスクリプトの環境を設定するには、スクリプトをBASH_ENV呼び出すときに変数を適切なファイルに設定します。これにより、コントロールをスクリプトに渡す前にソースコードがファイルになりますbash$BASH_ENV

たとえば、

BASH_ENV="$HOME/.profile" "$HOME/scripts/myscript.sh"

これはただこれは、スクリプトが非対話型シェルセッション(cron操作など)で呼び出され、環境変数またはソースファイル内のすべてのファイルを設定するためにアクセスする必要がある場合に~/.profile必要です~/.profile

対話型シェルセッションでは、BASH_ENV変数をこのように設定する必要はなく、スクリプトはこれらの変数を取得する必要がないか、すでに取得しているため必要ありませ~/.bashrc~/.profile

おすすめ記事