Bash "$@"는 변수를 대체하지 않습니다.

Bash "$@"는 변수를 대체하지 않습니다.

죄송합니다. 누군가 이 질문을 했을 수도 있지만 이러한 특수 문자를 올바르게 검색할 수 없습니다.

나는 다음을 가지고 있습니다 script.sh:

#!/bin/bash

export c=23;

"$@"

내가 그것을 호출할 때:

(export a=231; export b=45; ./script.sh echo "$a, $b, $c")

변수가 $c출력에 표시되지 않습니다.

231, 45,

실행된 명령에 추가 변수를 추가하는 통과 스크립트를 어떻게 만들 수 있습니까?


전체 내용을 보려면 다시 편집하세요.

사용법은 도커 컨테이너가 있다는 것입니다. dockerfile은 빌드할 때 COMMIT_HASH를 얻습니다. 그런 다음 (컨테이너 실행을 위해) 호출 java app.jar하고 해당 실행 프로세스를 COMMIT_HASH 변수로 구성해야 합니다.

그래서 에서는 Dockerfile이제 다음과 같은 것을 갖게 되었습니다.

RUN echo "#!/bin/bash \n java -Dapp.info.commit-hash=\"${COMMIT_HASH}\" -jar /app.jar \"\$@\"" > ./entrypoint.sh

...

ENTRYPOINT ["./entrypoint.sh"]

보시다시피 이 설정으로는 jar의 매개변수를 구성할 수 없습니다. 하지만 컨테이너 외부에서 완전한 명령을 생성하고 변수를 대체할 수 있는 방법을 모르겠습니다.

그렇기 때문에 이상적으로는 추가 변수를 지정할 수 있을 뿐만 아니라 변수를 기본값으로 구성할 수도 있는 스크립트를 갖고 싶습니다.

이것이 바로 최종 스크립트(현재 Dockerfile을 사용하지 않음)가 다음과 같은 이유입니다.

#!/bin/bash

export COMMIT_HASH=a982321bc232d;

"$@"

그런 다음 함께 병합합니다.

# read from a .env file or something - these are dynamic values
export PORT=8081;
export FRONTEND_URL=http://example.com;

java -Dapp.info.commit-hash="${COMMIT_HASH}" -Dserver.port="${PORT}" -jar /app.jar --FRONTEND_URL="${FRONTEND_URL}"

답변1

스크립트를 호출할 때 for imprint를 이스케이프 처리 하고 $c스크립트에서 eval "$@"두 번째 변수 확장을 수행해야 합니다 .

$ cat script.sh
#!/bin/bash

export c=23;

eval "$@"
$ (export a=231; export b=45; bash -x ./script.sh echo "$a, $b, \$c")
+ export c=23
+ c=23
+ eval echo '231, 45, $c'
++ echo 231, 45, 23
231, 45, 23

또는 스크립트 코드에 작은따옴표를 보내고 스크립트 셸에서 모든 변수를 확장하도록 합니다.

$ (export a=231; export b=45; bash -x ./script.sh 'echo "$a, $b, $c"')
+ export c=23
+ c=23
+ eval 'echo "$a, $b, $c"'
++ echo '231, 45, 23'
231, 45, 23

관련 정보