아무도 아래의 두 가지 예 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
는 중요하지 않습니다 .bash
perl
python
. 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
는 현재 쉘의 환경 변수를 설정 / 수정할 수 있다는 것입니다.