죄송합니다. 누군가 이 질문을 했을 수도 있지만 이러한 특수 문자를 올바르게 검색할 수 없습니다.
나는 다음을 가지고 있습니다 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