bashrcの非対話型バージョンがないのはなぜですか?

bashrcの非対話型バージョンがないのはなぜですか?

私が理解しているように、デーモンはバックグラウンドプロセスですが、環境変数を設定するにはデーモンに固有の設定ファイルが必要です。

たとえば、Hadoopデーモンには次のものが必要です。hadoop-env.sh環境変数を設定するには、JAVA_HOME単にから始めることはできません~/.bashrc

その理由は、デーモンがバックグラウンドプロセスであることは非対話型であることを意味し、 ~/.bashrc は防止するためにインタラクティブセッションでのみ使用されなければならないからです。alias cp='cp -i'ケース

最新の~/.bashrcファイルの上部には、非対話型呼び出し側を許可しない安全ガードがあります。つまり、-iどのオプションも早く返されません。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

これがbashrcが設定ファイルを3つのグループに分割しない理由を疑問に思います。たとえば、次のようになります。

  • ~/.bashrc_interactive

  • ~/.bashrc_non_interactive

  • ~/.bashrc_global#(対話型と非対話型)

したがって、ユーザーはすべてのデーモンファイルにこの環境変数を繰り返し追加する代わりに、それを設定またはJAVA_HOME追加できます。~/.bashrc_non_interactive~/.bashrc_global

bashrcがこれをサポートしていないか、他の方法で非対話式でサポートしない理由や制限はありますか?それとも私がいくつかの概念を間違って理解したのでしょうか?

ベストアンサー1

BASH_ENV非対話型シェルスクリプトを実行する前に解析するファイルのパス名を設定する機会がすでにあります。

たとえば、crontabでは次のことができます。

@hourly BASH_ENV="$HOME/.bashrc_non_interactive" "$HOME/bin/mybashscript"

でも

BASH_ENV="$HOME/.bashrc_non_interactive"

@hourly "$HOME/bin/mybashscript"
@daily  "$HOME/bin/myotherbashscript"

$BASH_ENV/etc通常は空ですが、サーバー全体で設定して下のファイルを指すのを防ぐことはできません。

if [ -f "$HOME/.bashrc_non_interactive" ]; then
    . "$HOME/.bashrc_non_interactive"
fi

ただし、スクリプトがなどの特定の変数を設定する必要がある場合は、スクリプトごとに明示的に設定するか、スクリプト自体から関連ファイルを明示的にインポートするか、単に設定することをお勧めしますJAVA_HOMEBASH_ENVスクリプトの変数です。集めるみんな非対話型シェル この単一ファイルで使用しようとするすべてのアイテムは、スクリプトの速度を低下させ、不要なコンテンツでスクリプト環境を汚染する可能性があります。

おすすめ記事