web-dev-qa-db-ja.com

どのbashrcファイルが非対話型/非ログインシェルで実行されていますか?

私の理解

  • 非対話型/非ログインシェル用に呼び出されるrcファイルはありません。たとえば、cronによって実行されるもの
    (これは確かにわかりません。コミュニティの専門知識に頼ります)

  • 非対話型シェルでは、BASH_ENV環境変数を設定する必要があります。これにより、特定のrcファイル(例:BASH_ENV=$HOME/.bash_profile)に設定できます。

希望

利用できるrcファイルが多すぎるかどうかはわかりません。慣れていないファイルがあるかどうか知りたいです。次の条件を満たすrcファイルを見つけたいと考えています。

  • インタラクション/ログインモードに関係なく呼び出されるため、グローバルシェル環境変数を1か所で設定できます
  • csh/tcshのように動作します
3
vol7ron

特定の質問に対する答えは、多くの場合、/etc/bash.bashrc(または/etc/bashrc)のみがロードされるということです。

これに対処するにはいくつかの方法があるようですが、残念ながらほとんどが回避策です。優先順位は特にありません。

偽のログイン

ログインは/etc/profileで実行され、多くの場合、カスタムスクリプトを/etc/profile.d/*.shに配置できます。

bashログインでラップします

ログインをトリガーするのが最も簡単な場合があります。

echo "do whatever $PATH $BASH $PS1 $0"

になります

bash -lc 'echo "do whatever $PATH $BASH $PS1 $0"'

プロファイルを手動でロードします

ログインが行うことを実行し、プロファイルを手動でロードします

source /etc/profile;echo "do whatever $PATH $BASH $PS1 $0"

グローバル環境変数を編集する

単純な変数については、/etc/environmentに追加できます。 buntu System-wide_environment_variables を参照してください。ただし、変数の展開は機能しません

THING_HOME="/opt/thing"
PATH="$PATH:/opt/thing" # this will NOT work

PATHの場合、それに追加できます。 Sudo sed -i 's#PATH=\"[^\"]*#&:/opt/thing#' /etc/environment

すべてのbashシェルを編集する

/etc/bash.bashrc(または/etc/bashrcに追加できますがこれは通常、非対話型の場合は早期に終了するため、前に追加をハックする必要があります。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

これらのどれもしないでください

  • PATHに何かを追加しようとしている場合は、シンボリックリンクを検討してください
  • プログラム/スクリプトに独自の環境を変更させることを検討してください
  • SystemdにはEnvironmentFileEnvironmentがあります。例: systemctl edit --full cron.service

他の誰かがより良い回避策を持っているかどうか聞いてみたいです!

4
KCD