소싱 ( '.'또는 'source')과 bash에서 파일을 실행하는 것의 차이점은 무엇입니까?


76

다음과 같이 스크립트를 실행하는 것의 차이점은 무엇입니까?

./test.sh

다음과 같은 스크립트를 실행하십시오.

. test.sh?

차이점이 있는지 찾을 수 있는지 확인하기 위해 간단한 두 줄짜리 스크립트를 시도했습니다.

#!/bin/bash
ls

그러나 모두 . test.sh./test.sh동일한 정보를 반환했습니다.


중복 된 경우 사과합니다. 추가 조사를 통해 'bash'대신 'bash dot'을 검색하여 관련 정보가있는 페이지를 발견했습니다.
Natan

3
것처럼 test.sh동일하지 않습니다 ./test.sh(첫 번째는 호출 PATH검색), 그래서이다 . test.sh. ./test.sh같은 방법으로 다른 (이전에는 호출 PATH검색). 경로 검색을 수행 할 때 많은 셸이 암시 적으로 포함 .되는 것처럼 보이지만 이 동작은 표준이 아닙니다. 따라서 vs 와 vs 를 비교하는 것이 더 정확합니다 . PATH.test.sh. test.sh./test.sh. ./test.sh
jw013

답변:


83

./test.shtest.sh별도의 프로그램으로 실행 됩니다. 파일 test.sh이로 시작 되면 bash 스크립트 일 수 있습니다 #!/bin/bash. 그러나 그것은 전혀 다른 것일 수 있습니다.

. ./test.sh실행 test.sh중인 bash 인스턴스 내 에서 파일 코드를 실행합니다. 내용 파일 test.sh. ./test.sh줄 대신 텍스트로 포함 된 것처럼 작동 합니다. (거의 :의 값 $BASH_LINENO, return내장 된 동작과 같은 몇 가지 세부 사항이 다릅니다 .)

source ./test.sh. ./test.shbash에서와 동일합니다 (다른 쉘에서는 source약간 다를 수도 있고 전혀 존재하지 않을 수도 있습니다 .. POSIX 표준에 포함시키기 위해).

내장 ./test.sh스크립트를 사용하여 스크립트를 포함하고 포함 하는 별도의 스크립트를 실행하는 것의 가장 일반적인 차이점은 스크립트가 별도의 프로세스로 일부 환경 변수를 설정하면 자식 프로세스의 환경 만 설정되는 반면 스크립트 포함은 환경입니다 단독 쉘 프로세스의 당신이 라인을 추가하는 경우 에 와 호출하는 스크립트의 끝에서, 당신은 차이를 볼 수 있습니다 :.test.shfoo=bartest.shecho $foo

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar

17
또한 echo $$스크립트에 추가 하면 차이점이 분명하게 나타납니다. $$변수는 현재 쉘의 PID를 보유하고 있습니다.

1
다른 사용 시나리오는 . ./test.sh다른 쉘 스크립트 내 에서 호출을 사용하여 test.sh에 설명 된 함수를 사용하는 것입니다. 내 말은, 그것은 당신이 설정할 수있는 변수가 아니라 bash 또는 다른 스크립트에서 호출 할 수있는 새로운 기능을 이런 식으로 만들 수 있다는 것입니다. . /usr/libexec/company/tools; custom_command "variable"
Rqomey

9

스크립트를 첫 번째 방법으로 실행하면 자식 프로세스로 실행됩니다. 반면 소싱 (두 번째 방법)은 모든 명령을 현재 쉘에 입력 한 것처럼 스크립트를 실행합니다. 스크립트가 변수를 설정하면 스크립트가 종료되면 세션이 종료됩니다. help .설명서를 참조하십시오 .


3

내가 주목해야 할 또 다른 사항은 다음과 같은 별칭이 있다면 :

# add into .bashrc_aliases
alias ls='ls -lht'

으로 ./test.sh당신은 정상거야 ls출력 (현재 쉘과는 다른 PID를)

auraham@pandora:~/iso$ ./test.sh 
dsl-4.4.10.iso  test.sh
3136 # PID

. test.sh또는 . ./test.sh좀 더 자세한 출력 (현재 쉘에 비해 같은 PID)를 얻을 것이다 :

auraham@pandora:~/iso$ echo $$
2767 # shell PID

auraham@pandora:~/iso$ . test.sh 
total 50M
drwxrwxr-x  2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x  1 auraham auraham   32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r--  1 auraham auraham  50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID

이를에 포함시킬 수 있습니다. .bashrc if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi 그런 다음에 별칭을 입력하십시오 .bash_aliases.
auraham

물론 alias키워드 를 계속 사용할 필요는 없습니까? (아마도 3 줄에 게시 한 실수일까요?)
Emanuel Berg

내 잘못이야 감사합니다 @EmanuelBerg
auraham

-1

저의 주요 사용은 source(나 .)이다 bash는 기능 .

많은 기능을 가진 스크립트가 있으며 내 모든 스크립트를 실행합니다 .bashrc. 내가 자주 사용하는 기능은 "명령"이된다.


.bashrc에서 소스, 스크립트의 절대 위치 및 명령 이름 (스크립트를 PATH 폴더에 배치)의 세 가지 방법을 모두 시도했지만 세 가지 방법 모두 작동했습니다.
Emanuel Berg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.