./bla.sh vs.를 사용하여 스크립트 호출 bla.sh


11

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

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

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

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

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

답변:


22
./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그들은 현재의 환경을 수정하기로되어 있기 때문에 이러한 파일은 일반적으로 공급됩니다.


3
또한 bla.sh에서 bash 환경을 변경하면이 변경 사항이 이후에 고려됩니다. bla.sh이지만 ./bla.sh 뒤에는 없습니다. 이 때문입니다 . bla.sh는 현재 bash의 컨텍스트에서 실행되는 반면 ./bla.sh는 하위 프로세스로 실행됩니다.
mouviciel

1
일부 예 는 mywiki.wooledge.org/BashFAQ/060 도 참조하십시오 . 참고 source를위한 bash는 별칭 .이 아닌 반대와 source다른 셸하지 않습니다 작동합니다.
mrucci

7

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

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


-1 . <cmd>은 프로그램을 찾고 $PATH찾을 수 없으면 현재 디렉토리를 찾습니다.
dogbane

@ dogbane 맞아, 나는 이것을 고쳤다.
kmkaplan

FWIW, 모든 쉘이 cwd에서 소스 sripts를 검색하지는 않습니다. zsh (적어도 내가 가진 구성)에 필요. ./cmd
bstpierre

1
@bstpierre 이것은 움직이는 땅인 것 같습니다. POSIX 레퍼런스는“쉘이 PATH로 지정된 검색 경로를 사용해야한다”와“일부 오래된 구현에서는 PATH 값이 허용하지 않더라도 파일의 현재 디렉토리를 검색했습니다.”라고 말합니다.
kmkaplan

1

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

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


더 정확하게 source에 bash는 전용 별칭입니다 .(표준)
user1686가

네 말이 맞아 결정된.
Leonid Volnitsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.