Bash 쉘을 사용할 때, 나는 때때로 내용을 복사/붙여넣는 텍스트 파일(exports.txt)에 환경 변수를 보관합니다.
export FOO=bar
export FIZZ=buzz
누군가 복사/붙여넣기 대신 터미널에 입력할 수 있는 방법을 보여줬습니다.
. exports.txt
복사/붙여넣기와 동일한 효과를 갖습니다.
이 '도트 스페이스 파일 이름' 명령이 작동하는 메커니즘은 무엇입니까? 이에 대한 검색어를 생각하기가 어렵습니다.
나는 무슨 일이 일어나고 있는지, 그리고 이 한 줄짜리 작업이 수행하는 작업에 대한 보다 일반적인 세부 사항을 이해하고 싶습니다.
답변1
("점") 명령 .
은 쉘 내장 source
명령의 동의어/단축키입니다.
이는 명명된 쉘 스크립트를 읽고 현재 쉘 컨텍스트 내에서(하위 쉘이 아닌) 실행하도록 합니다. 이를 통해 소스 스크립트는 변수 설정, 셸 함수 및 별칭 정의 등 호출 셸의 환경을 수정할 수 있습니다.
답변2
기존의 두 가지 답변은 이미 훌륭하지만, 말하자면 효과가 가장 "눈에 띄는" 예가 누락된 것 같습니다.
script.sh
다음 내용이 포함된 파일이 있다고 가정해 보겠습니다 .
cd dir
이 스크립트를 정상적으로( ) 실행하면 sh script.sh
다음과 같이 표시됩니다.
olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$
그러나 스크립트 소스 위치( . script.sh
)를 지정하면 다음과 같이 됩니다.
olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$
두 번째 경우에 메인 셸의 작업 디렉터리가 어떻게 변경되었는지 확인하세요!
이는 (다른 답변에서 지적했듯이) 첫 번째 예제가 자체 하위 쉘에서 실행되기 때문입니다( -command sh
로 시작하는 프로세스 sh
는 기본적으로 모든 쉘일 수 bash
있으며 dash
이름을 지정). 아무것도 하지 않고 닫힙니다. 두 번째 예제는 메인 셸에서 실행되므로 디렉터리가 변경됩니다!
답변3
여기에 예가 있습니다.
스크립트 파일: mytest.sh
cat mytest.sh
#!/bin/bash
myvar=1
mystring="Hello World"
위의 변수 중 하나를 인쇄하려고 하면 아무것도 얻지 못할 것입니다.
echo $myvar
하지만 만약 그렇게 한다면
. mytest.sh
또는
source mytest.sh
그런 다음
echo $myvar
1이 인쇄됩니다
Spiff가 쓴 내용에 대한 시각적 답변