명령 출력을 환경 변수로 저장

명령 출력을 환경 변수로 저장

명령 my_command의 출력이 다음과 같은 경우:

VAR1=some_value
VAR2=other_value

환경 변수로 저장 되도록 my_command쉘 스크립트에서 호출할 수 있습니까 ?VAR1VAR2

나는 다음을 시도했지만 그 중 아무것도 작동하지 않았습니다.

#!/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)"때문에 실제로 도움이 되지 않습니다 .exportVAR1=some_value\nVAR2=other_valueVAR1

다른 스크립트에서 변수를 다른 방식으로 실행하거나 설정하면 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
    

관련 정보