명령 my_command
의 출력이 다음과 같은 경우:
VAR1=some_value
VAR2=other_value
환경 변수로 저장 되도록 my_command
쉘 스크립트에서 호출할 수 있습니까 ?VAR1
VAR2
나는 다음을 시도했지만 그 중 아무것도 작동하지 않았습니다.
#!/bin/bash
source my_command
export `my_command`
하지만 수동으로 입력하면
export `my_command`
터미널 콘솔에서 두 변수를 저장합니다.
답변1
이러한 상황이 발생한 경우 my_command
:
#!/bin/sh
echo 'VAR1=some_value'
echo 'VAR2=other_value'
이것을 실행하면 분명히 인쇄됩니다
VAR1=some_value
VAR2=other_value
이제 source my_command
그럴 것이다달리기현재 셸의 스크립트는 배포판을 출력으로만 생성합니다. 작업이 인쇄되지 않고 직접 실행되는 source
경우에 사용할 수 있습니다.my_command
export $(my_command)
스크립트의 출력을 가져와서 내보내기로 전달하면 변수가 현재 쉘 환경에 저장됩니다.하지만명령 대체는 따옴표로 묶이지 않기 때문에 관련 변수에 공백이나 전역 문자가 포함되지 않은 경우에만 작동합니다. 따옴표를 넣는 것은 매개변수로 처리되고 설정만 되기 "$(my_command)"
때문에 실제로 도움이 되지 않습니다 .export
VAR1=some_value\nVAR2=other_value
VAR1
다른 스크립트에서 변수를 다른 방식으로 실행하거나 설정하면 export $(my_command)
해당 변수가 상위 셸에 설정되지 않습니다. 대화형 셸에서 할당이 발생하도록 하려면 거기서 실행해야 하지만 source
할당을 수행하는 함수나 스크립트에서 할당을 래핑할 수 있습니다.
확실한 해결책은 그렇게 ssh-agent
하고 스크립트가 export
설정한 변수를 출력하는 명령을 출력하도록 하는 것입니다. 그러면 달리면 충분합니다 eval "$(my_command)"
.
이 작업을 원하지 않는 경우 set -a
스크립트 이전에 을 사용하여 설정된 모든 변수를 쉘이 자동으로 내보내도록 할 수 있습니다.
그래서,
$ set -a
$ eval "$(my_command)"
Bash에서는 declare -p
( )를 사용하여 변수를 내보냈는지 확인할 수 있습니다 -x
.
$ declare -p VAR1 VAR2
declare -x VAR1="some_value"
declare -x VAR2="other_value"
여기를 사용하면 eval
스크립트가 인용된 문자열(예: )을 출력할 수 VAR1="foo bar"
있으며 올바르게 처리됩니다. 할당뿐만 아니라 eval
스크립트 출력의 my_command
다른 모든 것도 실행되지만 신뢰할 수 없다면 my_command
전혀 실행해서는 안됩니다.
답변2
상위 쉘에서 호출된 쉘 스크립트에서는 상위 쉘의 변수를 설정할 수 없습니다. 누구나
- 평소와 같이 스크립트에서 변수를 설정하고 가져옵니다.
. my_command
스크립트에서 설정할 변수를 인쇄
stdout
하고eval
결과를 평가하도록 하세요.$ cat foo.sh #!/bin/sh echo FOO=foo echo BAR=bar $ ./foo.sh FOO=foo BAR=bar $ eval $(./foo.sh) $ echo $FOO foo $ echo $BAR bar