2009-05-28 3 views
19

유닉스 명령 줄에서, 단순히 이름을 입력하여 프로그램을 실행하는 것과 a를 입력하여 프로그램을 실행하는 것의 차이점은 무엇입니까? (점) 다음에 프로그램 이름이 오는가? 예컨대 : "source"또는 ".는"현재의 프로세스에서 실행하는 명령을 야기 사용unix 명령 줄은로 실행합니다. (도트) 대하지 않고

runme 

. runme 
+0

PuTTy 터미널에서 두 번째 작업을 수행하면 ... – schnaader

+0

관련 : http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script - and-sourcing-a-bash-scrip/176788 # 176788 – lesmana

답변

24

. name은 현재 쉘에 name 파일을 제공합니다. 당신이를 소싱하는 경우 파일이 그 다음이

A=hello 

을 포함 그렇다면, 그 후에 당신은 안녕하세요이 포함됩니다 A라는 변수를 참조 할 수 있습니다. 파일을 실행하면 변수와 다른 것들 스크립트 세트에만 영향을주는 것 때문에 그러나, 다음과 같은 일들이 작동하지 않습니다 (적절한 실행 권한과 #!/interpreter 라인을 주어) 그것에서 실행되는 서브 쉘의 .

소싱 이진 파일은 의미가 없습니다. 쉘은 이진 파일을 해석하는 방법을 알지 못합니다 (이 파일은 현재 쉘에있는 파일을 C에있는 좋은 오래된메커니즘과 비슷하게 삽입합니다). 예 : 이진 파일을 실행

head -c 10 /dev/urandom > foo.sh; . foo.sh # don't do this at home! 
bash: �ǻD$�/�: file or directory not found 

그러나, 은 물론, 많은 감각을하지 않습니다. 따라서 일반적으로 실행하려는 파일의 이름을 지정하고 위의 경우 A=hello과 같은 특별한 경우에는 파일을 소스로 지정하려고합니다.

15

. 스크립트를 실행 파일로 실행하면 자체 프로세스가 제공됩니다.

현재 쉘에서 환경 변수를 설정하려는 경우 (별개의 프로세스에서는 수행 할 수 없음) 또는 쉘을 중단하지 않고 스크립트를 중단하려는 경우 ( 만 가능) 별도의 프로세스).

+0

그 프로세스 구별은 나를 위해 모든 것을 명확히했습니다. – Kvass

5

첫 번째 명령이 실행됩니다. 두 번째는 쉘 스크립트를 다른 쉘에 포함시키는 것을 의미합니다.

4

이 구문은 스크립트를 "로드하고"구문 분석하는 데 사용됩니다. 이 스크립트는 다른 스크립트와 공통된 기능을 가진 스크립트가있을 때 가장 유용하며, 단지 "포함"할 수 있습니다. 자세한 내용은 http://tldp.org/LDP/abs/html/internal.html을 참조하십시오 ("도트"명령으로 스크롤).

+0

dot 명령에 대한 링크의 경우 +1 ->'이 명령은 명령 줄에서 호출 할 때 스크립트를 실행합니다. 스크립트 내에서 소스 파일 이름은 file-name 파일을로드합니다. 파일을 소싱 (dot-command)하면 코드가 스크립트에 추가되고 스크립트에 추가됩니다 (C 프로그램의 #include 지시문과 동일한 효과). 실제 결과는 소스 코드 본문이 스크립트 본문에 실제로 존재하는 것과 같습니다. 이는 여러 스크립트가 공통 데이터 파일이나 함수 라이브러리를 사용하는 상황에서 유용합니다 .' – Levit

4

"runme"을 실행하면 새로운 프로세스가 만들어져 약간의 변화가 생겨 쉘에 영향을 미치지 않습니다.

". runme"을 실행하면 "runme"스크립트가 환경 변수를 변경하고 디렉토리를 변경하며 사용자가 대신 할 수있는 모든 종류의 다른 작업을 변경할 수 있습니다. 이미 실행중인 쉘 프로세스에 의해 해석되므로이 작업 만 수행 할 수 있습니다. 결과적으로, bash를 로그인 쉘로 실행하고 있다면 "." bash 스크립트를 사용한 표기법 (예 : C 쉘 스크립트의 2 진 파일).

관련 문제