./bla.sh vs.를 사용하여 스크립트 호출 bla.sh 지정된 스크립트를 작성해 봅시다

아무도 아래의 두 가지 예 A)와 B)에서 껍질이 무엇을하는지 설명 할 수 있습니까? 분명히 다르게 동작하지만 출력이 다른 이유를 알 수 없습니다.

예 :
현재 디렉토리에 bla.sh하나의 명령으로 이름 지정된 스크립트를 작성해 봅시다 .
echo ${0##/*} hello

A)
시작 ./bla.sh
:./bla.sh hello

B)
시작 . bla.sh
:-bash hello

스크립트에서 이것을 사용하기 때문에 -bash 앞의 “-“때문에 두 번째 출력이 명령을 종료합니다. 물론 도움이 --되기 전에 간단 ${...}하지만 처음에 출력의 원인을 이해하고 싶습니다.
나는 배쉬를 좋아한다. 그리고 vi [m]. 그러나 나는 탈선한다…



답변

./bla.sh

여기서 명령은 ./bla.sh입니다. 이렇게하면 쉘 bla.sh이 현재 디렉토리에서 이름이 지정된 실행 파일을 찾은 다음 쉘과는 별도의 프로세스에서 커널을 일반 프로그램으로 실행하도록 요청합니다. 스크립트, 하나 또는 하나 또는 컴파일 된 바이너리 인지 bla.sh는 중요하지 않습니다 .bashperlpython


. bla.sh

여기서 명령은 쉘의 내장 명령 인 .(일명 source)입니다. 쉘 bla.sh이 시스템 경로 ($ PATH)에 이름이 지정된 파일을 찾도록 하고 내용이 마치 사용자가 입력 한 것처럼 해석합니다. 이 모든 것은 쉘 자체 와 동일한 프로세스 에서 수행 되므로 쉘의 내부 상태에 영향을 줄 수 있습니다.

이것은 물론 쉘에 bla.sh대한 명령 bash(현재 사용중인 명령 인 경우)이 포함 된 경우에만 작동 하며 perl스크립트 나 다른 작업에서는 작동하지 않습니다 .

(이 설명되어 help .help source도.)


../완전히 다른 일 (경로의 일부 대 명령), 그들은이 결합 될 수 물론 – 사용하는 . ./bla.sh것 “소스”파일을 bla.sh현재 디렉토리에 있습니다.


일반적으로이 ./bla.sh방법 을 사용하는 것이 가장 좋습니다 . 만 ~/.bashrc, ~/.profile그들은 현재의 환경을 수정하기로되어 있기 때문에 이러한 파일은 일반적으로 공급됩니다.


답변

./<cmd>실행할 <cmd>프로그램을 새로운 (포크) 과정에서 현재 디렉토리에있는 그. 실행 가능해야합니다. 또한 읽을 수 있습니다 #!.

. <cmd>현재 쉘 이 현재 쉘 프로세스 <cmd>에서 사용자 $PATH또는 현재 디렉토리에있는 쉘 스크립트 를 실행하게합니다 . 읽을 수 있어야합니다. 쉘 명령의 별명입니다 .source


답변

./cmd./실행 파일에 대한 명시 적 경로 ( -현재 디렉토리)를 사용합니다. 그리고로 시작할 필요는 없습니다 #!.

. cmd-(일명 source)-bash 내장 명령. 실행을 통해 눈에 띄는 차이점 중 하나 source는 현재 쉘의 환경 변수를 설정 / 수정할 수 있다는 것입니다.