짧은 답변
귀하의 질문에, 두 번째 명령은 .
쉘 내장이나 내장을 사용하지 않습니다 source
. 대신 실제로 다른 실행 파일과 마찬가지로 이름으로 스크립트 를 호출하여 별도의 쉘에서 스크립트 를 실행하고 있습니다. 이렇게하면 별도의 변수 세트가 제공됩니다 ( 부모 쉘에서 변수 를 내 보내면 모든 자식 프로세스의 환경 변수가 되므로 자식 쉘의 변수에 포함됩니다 ). 를 /
공백으로 변경하면 .
내장 기능으로 실행 됩니다 source
.
확장 설명
이것은 source
셸 내장 구문으로, 현재 셸에서 스크립트의 내용을 실행합니다 (따라서 현재 셸 변수로).
source testenv.sh
.
내장 구문은 다음과 같은 기능을 수행합니다 source
.
. testenv.sh
그러나이 구문은 스크립트를 실행 파일로 실행하여 새 셸을 실행하여 실행합니다.
./testenv.sh
.
내장 되어 있지 않습니다 . 오히려, .
실행중인 파일 경로의 일부입니다. 일반적으로, 적어도 하나의 /
문자 를 포함하는 이름으로 호출하여 실행 파일을 쉘에서 실행할 수 있습니다 . 따라서 현재 디렉토리에서 파일을 실행하는 ./
것이 가장 쉬운 방법입니다. 현재 디렉토리가에 있지 않으면 PATH
명령을 사용하여 스크립트를 실행할 수 없습니다 testenv.sh
. 이는 사람들이 시스템 명령이나 PATH
환경 변수에 나열된 일부 디렉토리에 존재하는 다른 파일을 실행하려고 할 때 실수로 현재 디렉토리에서 파일을 실행하지 못하게하기위한 것입니다 .
(오히려보다 이름의 파일 실행 이후 source
또는 .
) 새로운 쉘에서 실행, 그것은 쉘 변수의 자신의 세트가됩니다. 새 쉘 은 호출 프로세스 (이 경우 대화식 쉘)에서 환경 변수를 상속받으며 해당 환경 변수는 새 쉘에서 쉘 변수가됩니다. 그러나 쉘 변수를 새 쉘로 전달하려면 다음 중 하나에 해당해야합니다.
쉘 변수가 익스포트되어 환경 변수가되었습니다. 이를 위해 export
쉘 내장을 사용하십시오 . 예를 들어, export MY_VAR=12345
한 단계에서 변수를 설정하고 내보내는 데 사용할 수 있으며 이미 설정되어 있으면 간단히 사용할 수 있습니다 export MY_VAR
.
쉘 변수는 명시 적으로 설정되어 실행중인 명령에 전달되어 명령이 실행되는 동안 환경 변수가됩니다. 이것은 일반적으로 다음을 수행합니다.
MY_VAR=12345 ./testenv.sh
경우 MY_VAR
수출되지 않은 쉘 변수이다, 당신도 실행할 수 있습니다 testenv.sh
에 MY_VAR
의해 환경 변수로 전달 자체로 설정 :
MY_VAR="$MY_VAR" ./testenv.sh
./
스크립트 구문이 제대로 작동하려면 Hashbang 줄이 필요합니다
그건 그렇고, 위와 같이 ( .
또는 source
내장 쉘이 아닌) 이름으로 실행 파일을 호출 할 때 실행하는 데 사용되는 쉘 프로그램은 일반적으로 실행중인 쉘에 의해 결정 되지 않습니다. . 대신 :
바이너리 파일의 경우, 커널은 특정 유형의 파일을 실행하도록 구성 될 수 있습니다. 파일의 처음 2 바이트 에서 이진 실행 파일의 종류를 나타내는 "마법 번호" 를 검사합니다 . 실행 바이너리를 실행할 수있는 방법입니다.
물론 실행 가능한 바이너리 인 쉘이나 다른 인터프리터 없이는 스크립트를 실행할 수 없기 때문에 이것은 매우 중요합니다! 또한 많은 명령과 응용 프로그램은 스크립트가 아니라 컴파일 된 바이너리입니다.
( #!
텍스트 실행 파일을 나타내는 "마법 번호"의 텍스트 표현입니다.)
쉘 또는 다른 해석 언어로 실행되는 파일의 경우 첫 번째 행은 다음과 같습니다.
#!/bin/sh
/bin/sh
프로그램을 실행하기 위해 다른 쉘이나 인터프리터로 대체 될 수 있습니다. 예를 들어, 파이썬 프로그램은 다음 줄로 시작할 수 있습니다.
#!/usr/bin/python
이 줄을 hashbang, shebang 및 기타 여러 유사한 이름이라고합니다. 이 FOLDOC 항목 , Wikipedia 기사 및 #! / bin / sh를 통역사가 읽습니까? 자세한 내용은.
텍스트 파일이 실행 가능 으로 표시되어 있고 셸 (예 :)에서 실행 ./filename
하지만로 시작 하지 않으면#!
커널이이를 실행하지 못합니다. 그러나이 일어난 것을보고, 쉘이됩니다 시도 에 이름을 전달하여 실행하는 일부 쉘. 어떤 쉘 인지 에 대한 요구 사항 은 거의 없습니다 ( "쉘은 쉘을 호출하는 것과 동등한 명령을 실행해야합니다 ..." ). 실제로 *를 포함한 일부 쉘 은 다른 인스턴스를 실행 하지만 다른 쉘 은bash
/bin/sh
. 나는 이것을 피하고 대신 hashbang 라인을 사용하는 것이 좋습니다 (또는 원하는 인터프리터 (예 :)에 스크립트를 전달하여 실행하십시오 bash filename
).
* 수동 GNU 배쉬 , 3.7.2 명령 검색 및 실행 : "파일이 실행 파일 형식이 아닌, 파일이 디렉토리는,로 가정하지 않기 때문에이 실행이 실패하면 쉘 스크립트 설명과 쉘이 실행을 에서 쉘 스크립트 . "
source
다시로드하거나 다시 시작할 필요없이 bash에서 함수를 사용할 수 있다는 것입니다. 예#!/bin/bash function olakease {echo olakease;}
. 당신이 그것을로드하면 bash에서source file.sh
직접 호출 할 수 있습니다olakease
. 정말 좋아합니다. 소스는 많은 것들을.
실행하고 , 점 은 실행만을위한bash file.sh