여러 Amazon EC2 계정이 있고 다음을 사용하여 $EC2_HOME
와 같은 변수를 빠르게 전환 할 수 있기를 원합니다. 스크립트입니다.
다음과 같이 설정된 셸 스크립트가 있습니다.
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
스크립트를 실행하면 EC2_HOME
가 설정되었지만 export
를 사용하면 스크립트가 완료된 후 변수가 고정 될 것이라고 생각했습니다. echo $EC_HOME
를 실행해도 아무 것도 표시되지 않으므로 그렇지 않습니다.
이것은 매우 기초적인 Linux 스크립팅 지식이어야한다는 것을 알고 있지만 모르겠습니다. 운없이 관련 질문을 찾아 보았습니다. 중복되는 경우 사과드립니다.
답변
스크립트를 제공해야합니다.
. ./script
또는
source ./script
댓글
- 이유는 스크립트가 현재 셸의 자식으로 새 셸 프로세스를 생성하기 때문입니다. 자식 프로세스에서 변경 한 환경은 부모에 영향을 줄 수 없습니다 . div id = “323cc66047″>
또는 source
, 새 하위 프로세스를 생성하지 않고 현재 셸에서 명령을 실행하고 있습니다.
.
또는 source
를 수행 할 때 쉘에서 로그 오프됩니다. 왜 이건 pening? exit
문이있을 수 있으므로 소싱하기에 적합하지 않습니다. source ./script
는 완전히 잘 작동합니다. sudo source ./script.sh
는 sudo: source: command not found
를 말합니다. sudo를 사용하여 어떻게 할 수 있습니까? sudo
의 컴파일 기본 설정 및 /etc/sudoers
sudo
로 명령을 실행할 때 환경을 보존 할 수 있거나 보존 할 수 없습니다. 스크립트를 소싱 한 다음 -E
옵션을 사용하여 sudo
를 실행하여 환경을 보존하는 것이 좋습니다. 작동하지 않으면 할 수있는 일이 거의 없다고 생각합니다. 답변
실행할 때 스크립트는 자체 쉘과 자체 환경을 가져오고 스크립트가 완료되면 다시 사라집니다. 환경 변수를 유지하려면 스크립트를 현재 셸로 소싱하세요.
$ source ./a.sh
또는 동등하게 (하지만 좀 더 이식 가능하게) POSIX dot 명령 :
$ . ./a.sh
그런 다음 정의가 현재 셸의 환경에 배치되고 상속됩니다. 스크립트 실행에 더 가까워 지도록 . a.sh
는 PATH
환경 변수입니다.
이러한 작동 방식과 .
및 source
는 동일하거나 전혀 존재합니다. . ./a.sh
는 모든 POSIX 호환 셸에서 확실히 동일하게 작동하지만 source
및 .
, . a.sh
및 . ./a.sh
는 다를 수 있습니다. . Bash의 경우 source
및 .
는 모든 경우에 동일합니다 . for zsh source
는 항상 현재 디렉토리를 먼저 확인합니다 ; ksh는 본질적으로 유사합니다.
스크립트 이름이 경로 (/
포함)로 제공되면 해당 경로가 직접 사용됩니다. 모든 경우에. 가장 신뢰할 수있는 작업은 . ./script
또는 . /path/to/script
입니다.
답변
기록 용입니다.
환경을 시스템으로 내보내는 인터넷에서 스크립트를 실행하려는 경우
다음 형식을 사용할 수 있습니다.
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
예 :
source <(curl -s -L https://example.com/install.sh)
댓글
- 위험 해 보이지만 스크립트를 신뢰한다면 유용합니다!
답변
exec ./script
exec 명령은 비대화 형 셸을 시작하지 않고 현재 셸에서 스크립트를 실행합니다.