bashおよびshモードで実行されるbashのENVおよびBASH_ENV処理

bashおよびshモードで実行されるbashのENVおよびBASH_ENV処理

/etc/profile特定のコマンド(または~/.profile他のコマンド)が最初に実行されるようにシェルを呼び出す方法(まず、bashシェルとposixシェルをサポートする必要があります)を見つけようとしています。

私が次のことをしたとき:

echo "echo 'test'" > /tmp/file
BASH_ENV=/tmp/file ENV=/tmp/file sh

私は得る:

test
$

これはいいですね。検査の結果、$SHELL実際にはモードbashで実行されていたことがわかりましたsh

私が同じことをしようとするとbash

echo "echo 'test'" > /tmp/file
BASH_ENV=/tmp/file ENV=/tmp/file bash

私は得る:

$

ENV私はbashがモードで私のファイルのコマンドを実行し、通常モードでも同じことをしたいのですが、それは起こりません。shBASH_ENV


bashより広い背景は、呼び出すことができるか、sh環境変数を使用して最初にシェルでいくつかの初期化を実行するドッカーコンテナを構築しようとしていることです。

Dockerfileしたがって、問題を再現するための最小値は次のとおりです。

FROM alpine

RUN apk add bash

RUN echo "echo 'test'" >> /etc/profile
ENV ENV=/etc/profile
ENV BASH_ENV=/etc/profile

同様に、ビルド後に実行するとdocker run ... sh期待どおりに機能しますが、docker run ... bash読み取りは機能しません/etc/profile


なぜそのような違いがありますか?この動作はマニュアルと矛盾していますか?

答え1

BASH_ENV非対話型bashのみ:

BASH_ENV

シェルスクリプトを実行するためにBashを呼び出すときにこの変数を設定すると、その値が拡張され、スクリプトが実行される前に読み込まれる起動ファイルの名前として使用されます。バラよりバッシュ開始ファイル

そして:

たとえば、Bashが非対話式で起動されたときにシェルスクリプトを実行するには、BASH_ENV環境内で変数を探し、その値が環境にある場合は展開し、拡張値をファイルとして読み込み実行します。 。

ENVしかし、それは本当ではありません。bash は次のように呼び出されます。sh:

というインタラクティブシェルを呼び出すと、shBashは変数を探し、そのENV値が定義されている場合は展開し、拡張値を読み取り、実行するファイル名として使用します。

質問の内容のうち、これに矛盾するものはありません。

関連情報