답변:
. executable
구문은 그냥 실행 작업 (또는합니까?)하지 않습니다. 대신 bash source
내장 의 별명입니다 . 차이점은 대부분 bash 스크립트와 관련이 있으며 사실은 완전히 다릅니다. :)
./executable
실행 파일을 "정상적으로"실행하도록 요청합니다. ./
현재 경로에 대한 상대 참조입니다. 이것은 쉘 (bash)이 디렉토리에서 실행 파일을 찾으려고 $PATH
하지 않도록합니다 (명령으로 경로를 지정하지 않은 경우). 당신이 할 수없는 이유 executable
는 보안 중 하나입니다. 다운로드 한 아카이브의 압축을 풀고의 악성 버전이 포함되어 있다고 상상해보십시오 ls
. 현재 디렉토리에서 직접 실행 한 경우 실현하지 않고 해당 버전을 실행합니다.
반면에, . executable
"이름이 executable
"인 파일을 찾으십시오 . 파일의 이름을 직접 지정하고 실제로 실행 파일 일 필요는 없으므로 $ PATH에 대한 보안 제한이 적용되지 않습니다. 소싱은 쉘 스크립트 만 "실행"하거나 실행하는 것처럼 보입니다. 그것이하는 일은 :
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
그렇다면 ... 실행과 소싱의 차이점은 무엇입니까? 동일한 쉘 스크립트를 가정하고 실행하면 ( ./script
) 새 쉘을 생성하고 해당 쉘 내에서 스크립트를 실행하며 스크립트가 종료되면 해당 쉘을 닫고 상위 쉘로 돌아갑니다. 실제로 bash
는 스크립트를 실행하기 위해 새 프로세스를 시작합니다 .
( . script
)는 현재 쉘이 명령 행에 입력 된 것처럼 파일에서 명령을 읽도록합니다. 새로운 쉘이 생성되지 않습니다.
이 동작을 확인하는 가장 쉬운 방법은을 포함하는 스크립트를 작성하는 것 exit
입니다. 그럴 경우 ./script
아무 일도 일어나지 않는 것 같습니다. 새 쉘 프로세스가 시작되고 exit
명령이 새 쉘을 종료하고 현재 쉘에 영향을 미치지 않기 때문 입니다.
이면 . script
현재 터미널에서 exit
명령이 실행 되므로 현재 터미널이 닫힙니다 . 따라서 exit
명령 프롬프트 에서 입력 하는 것과 같습니다 .
ls
출력 을 볼 수있는 방법과 비슷 합니다. 명령을 입력하고 실행하여 출력을 표시 한 다음 종료하지만 출력은 터미널에 남아 있습니다.
bash
안에서 실행 되는 쉘 이 명령 프롬프트를 제공 합니다. 을 입력 bash
하면 다른 쉘을 실행하게됩니다 . 첫 번째 셸에는 실행되는 프로그램 일뿐입니다. 을 입력 exit
하면 마지막으로 시작한 쉘 이 닫히지 만 여전히 첫 번째 쉘 (터미널을 시작할 때의 쉘)에있게됩니다. 다시 말하지만, 이것은 모두 동일한 터미널 내에서 발생합니다.