/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
해당 값이 정의되어 있으면 확장한 다음 확장된 값을 읽고 실행할 파일 이름으로 사용합니다.
질문의 내용 중 이에 모순되는 내용은 없습니다.