envsubst의 SHELL-FORMAT 란 무엇입니까?


19

내가 우연히 만났을 때 envsubst나는 특정 변수 만 교체하기 위해 그것을 사용하고 싶었고 SHELL-FORMAT 매개 변수가 원하는 것일지도 모르지만 작동 시키지는 못했습니다.

불행히도 maninfo페이지는 사용 예를 제공하지 않으며 단지

SHELL-FORMAT이 제공되면 SHELL-FORMAT에서 참조되는 환경 변수 만 대체됩니다.

그것들을 참조하는 방법을 알려주지 않습니다.

답변:


20

텍스트에서 알 수 있듯이 일반적인 쉘 명령에서와 같이 변수 를 참조하면됩니다 (예 : $VARNAME또는 ${VARNAME}). 그러나 쉘이 미리 확장하지 않도록해야합니다.

다음은이를 설명하는 몇 가지 예입니다 (가정 export FOO=BAR).

$ echo '$FOO$FOO2' | envsubst
BAR

보시다시피 $ FOO2는 정의되지 않았으므로 ""로 대체되었습니다. 이제 다음을 통해 교체를 $ FOO로만 제한 할 수 있습니다.

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

""대신에 사용 ''하면 원하기 전에 대체로 이어집니다.

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(이것은 envsubst "BAR"변수를 감지하지 않으므로 대체되는 효과적인 호출에 해당합니다 .)

는 AS man-page 말했다에서 참조되는 모든 변수는 SHELL-FORMAT우리가 심지어이 작업을 수행 할 수 있도록 대체된다 :

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2

보시다시피, SHELL-FORMAT매우 유연합니다.

마지막으로 매개 변수를 --variables사용하면 다음으로 대체 할 변수를 평가할 수 있습니다 SHELL-FORMAT.

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3

위의 조기 대체 예제에서 이것은 오류를 표시했을 것입니다.

$ envsubst --variables "$FOO"
(empty string returned)

man-page에 명시된 바와 같이 envsubststdinput을 처리하지 않습니다 --variables.


8

다음은 올바르게 사용하는 방법을 이해하는 데 도움이 된 몇 가지 예입니다. envsubstonly가 매개 변수에 언급 된 변수를 대체한다는 것은 놀랍습니다.

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

나는 SHELL-FORMAT이 무엇을 의미하는지 이해하지 못했지만 왜 그렇게 이름이 붙여 졌는지 모르겠습니다. 그러나 위의 실험 후에 나는 그것이 무엇을하는지 알고 있다고 생각합니다.


이것은 사람의 도움과 정보에서 그 예를 읽은 후에 SHELL-FORMAT이 존재한다는 것을 알고 있지만 그것을 선언하는 방법을 모른다는 데 많은 도움이됩니다!
zw963

0

그 말은 약간 혼란입니다. 도움말 텍스트를 더 세밀하게 바꾸려면 :

SHELL-FORMAT환경 변수에 대한 참조를 포함하는 선택적 텍스트 명령 행 인수입니다. 텍스트에서 환경 변수를 참조하려면 변수 이름 앞에 접두사를 붙이십시오 $. : 예를 들어, Hello $FOO World $BAR참조 환경 변수 FOOBAR. 나머지 문자열은 무시됩니다. SHELL-FORMAT명령 행 인수가있는 경우 stdin을 통해 수신 된 텍스트에서 변수 대체가 발생하면 SHELL-FORMAT명령 행 인수 에서 참조되는 변수로 제한됩니다 .

따라서 질문에 명시 적으로 대답하려면 변수 이름 앞에 접두사를 붙이십시오 $.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.