/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がモードで私のファイルのコマンドを実行し、通常モードでも同じことをしたいのですが、それは起こりません。sh
BASH_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
:
というインタラクティブシェルを呼び出すと、
sh
Bashは変数を探し、そのENV
値が定義されている場合は展開し、拡張値を読み取り、実行するファイル名として使用します。
質問の内容のうち、これに矛盾するものはありません。