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해당 값이 정의되어 있으면 확장한 다음 확장된 값을 읽고 실행할 파일 이름으로 사용합니다.

질문의 내용 중 이에 모순되는 내용은 없습니다.

관련 정보