web-dev-qa-db-ja.com

非対話型bashセッションごとに同じコマンドを実行します

いくつかの構成を実装する必要があります-システム上の誰かが任意の形式(対話型、非対話型、およびbash -c形式)でbashコマンドを要求した場合、いくつかのコードを実行する必要があります。たとえば、これは各bash呼び出しに追加したいコマンドです。
touch /tmp/$RANDOM
その行を/bash/bash.bashrcに追加しました。これは、ログオンシェルと、bashコマンドを呼び出して初期化されたシェルで正常に機能します。
しかし、これは次のように初期化されたbashセッションでは機能しません。
bash -c 'echo 1'-新しいファイルは作成されません

私が理解しているドキュメントから、bash.bashrcbash_profileはログオンまたはインタラクティブシェルに対してのみ呼び出されることがわかりました。非対話型シェルに対しても同様の呼び出しを作成する方法はありますか?

4
ShockwaveNN

非対話型シェルとして呼び出されたときにbashでファイルを解析するには、そのファイルを指すように環境変数BASH_ENVを設定する必要があります。 man bash(呼び出しに関するセクション)から:

たとえば、bashが非対話的に開始されると、シェルスクリプトを実行するために、環境内の変数BASH_ENVを検索し、そこに表示されている場合はその値を展開し、展開された値を読み取りおよび実行するファイルの名前として使用します。 。 Bashは、次のコマンドが実行されたかのように動作します。

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

ただし、PATH変数の値は、ファイル名の検索には使用されません。

では、どこにBASH_ENVを設定しますか?

Either:変数をシステム全体の環境で使用できるようにする場合は、/etc/environmentを配置するのが適切です。このファイルは、システム全体の環境変数設定用に特別に作成されています。シェルではなく、PAMモジュールpam_envによって解析されるため、シェル構文や変数展開は使用できませんが、次のタイプの単純な割り当てのみを使用できます。

    VARIABLE=value

または

    VARIABLE=/full/path/to/file

変更は次回のログイン/認証時に有効になるため、新しいttyコンソールに切り替えるか、ログアウトしてセッションに再ログインします。

標準のデスクトップシステムでは、これは、コンソールログイン、ssh、ディスプレイマネージャーだけでなく、atdやcronなどのデーモンを含む、PAMを使用するすべてのタイプの認証済みセッションで機能するはずです。すべてが期待どおりに機能する場合は、完了であり、読み進める必要はありません。

ただし、一部のプログラム/ディストリビューションのPAM構成ファイルに間違いが潜入することがあるため、/etc/environmentが特定の種類のプログラムによって解析されない場合は、必要なPAMモジュールがそのためのPAM構成ファイルにロードされていることを確認してください。 /etc/pam.dのプログラム:

    session       required   pam_env.so readenv=1

(注:構成ファイルの読み取りをオン/オフにするreadenvフラグは、デフォルトでオン(1)に設定されているため、実際には必要ありませんが、どちらかを確認しても問題はありません。 )

または:pam_envを提供しないシステムで作業している場合、私の頭に浮かぶ最善の代替策は、単純なinitスクリプト(またはsystemdのサービスユニットファイル)を作成することです。これは、起動時にカスタム構成ファイル(/etc/default/environmentなど)を解析します。

1
Shevek