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
를 출력합니다 .abcd
BAR
c1.sh
c2.sh