bash 스크립트를 연결(즉, 순차적으로 실행)하고 이러한 bash 스크립트에 환경 변수를 설정합니다.

bash 스크립트를 연결(즉, 순차적으로 실행)하고 이러한 bash 스크립트에 환경 변수를 설정합니다.

hadnodes.conf 파일이 있습니다(AWS 가상 머신의 노드 IP 주소 설정).

> ls -lista hadnodes.conf

7733498 4 -rwxrwxrwx. 1 pol pol 141 Feb 20 08:05 hadnodes.conf

콘텐츠(실제 IP 아님):

> more hadnodes.conf 

#!/bin/bash
export NAME_NODE=18.202.25.99
export DATA_NODE_1=52.30.117.99
export DATA_NODE_2=34.248.153.99
export DATA_NODE_3=52.17.111.99

다른 스크립트 파일 setnodes

> ls -lista setnodes 

7733504 4 -rwxrwxr-x. 1 pol pol 92 Feb 20 09:59 setnodes

콘텐츠:

> more setnodes 
#!/bin/bash
source /home/pol/dcu/ca675_cloud_technologies/assignment_1/nodes/hadnodes.conf

이제 입력하면 setnode가 작동하도록 할 수 있습니다.

source /path/to/setnodes

하지만 내가 달리면 그렇지 않아

. /path/to/setnodes

설명대로여기그리고여기.

그러나 실행 가능한 스크립트로 > setnodes를 실행하면 변수가 허용되지 않습니다. 즉, $NAME_NODE, DATA_NODE_1 및 c는 정의되지 않습니다. 해당 디렉터리를 $PATH에 넣어두었는데 탭 완성이 일어나서 스크립트가 안 보이는 것은 아닙니다. ""> which setnodes" 명령을 사용해도 올바른 디렉터리에 표시됩니다.

또한 hadnodes.conf 스크립트를 실행하기 위해 setnodes에서 "exec"를 사용해 보았습니다(언급한 대로).여기) 그러나 아무 소용이 없습니다.

스크립트 "N"의 환경 변수가 체인을 통해 호출 셸/환경(스크립트 0)으로 전달되도록 bash 스크립트를 "체인"(순차적으로 실행)하는 측면에서 내가 누락된 것이 무엇인지 궁금합니다.

답변1

스크립트 "N"의 환경 변수가 체인을 통해 호출 셸/환경(스크립트 0)으로 전달되도록 bash 스크립트를 "체인"(순차적으로 실행)하는 측면에서 내가 누락된 것이 무엇인지 궁금합니다.

당신은 이것을 할 수 없다는 사실을 무시하고 있습니다. "환경"이라는 것은 없으며 오히려 각 프로세스에는 고유한 환경이 있습니다. 기술적으로 말하면 환경은 exec*()상위 프로세스에서 하위 프로세스로(또는 실행된 프로그램을 호출한 프로그램에서) 전달되는 문자열 집합일 뿐입니다. 프로그램 자체의 지원 없이는 환경 변수를 "상향으로" 전달하거나 실행 중인 프로그램의 환경을 수정할 수 있는 방법이 없습니다.

.또는 를 사용하여 스크립트를 가져오는 것은 source실제로 별도의 프로세스에서 스크립트를 실행하는 것이 아니라, 대신 쉘 자체를 호출하여 외부 스크립트가 실행되는 것과 동일한 컨텍스트에서 스크립트를 읽고 처리하는 것입니다.

그래서 스크립트가 있다면a.sh

export FOO=abcd

그런 다음 실행은 "상위" 쉘 환경에 변수를 설정합니다 . a.sh. FOO하지만 ./a.sh평소처럼 달리는 일은 일어나지도 않고 일어날 수도 없습니다.


변수 할당을 "상향으로" 전달하는 한 가지 방법은 이를 설정하기 위한 셸 명령을 출력한 다음 eval"상위" 셸에서 실행하는 것입니다. 그게 다입니다 ssh-agent. 쉘의 구현은 다음과 같습니다( b.sh).

#!/bin/sh
# do something else here, but don't produce output
echo 'export FOO=abcd'

이제 실행하면 상위 쉘이 대체 명령에서 받은 명령을 실행합니다 eval "$(./b.sh)".export FOO=abcd

그러나 서브루틴이 쉘 스크립트인 경우 위와 같이 얻는 것이 더 쉬울 수 있습니다.


물론 체인 연결에 관해 이야기할 때 한 셸에서 변수를 설정한 다음 다른 셸을 호출하고 세 번째 셸을 호출할 수 있습니다.

$ cat c1.sh
#!/bin/sh
export BAR=abcd
./c2.sh
$ cat c2.sh
#!/bin/sh
echo "$BAR"

이제 run 은 run 을 c1.sh실행 하고, 의 값은 에서 로 "하향" 상속 되기 때문에 c2.sh를 출력합니다 .abcdBARc1.shc2.sh

관련 정보