
달리기의 차이점은 무엇입니까?
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
( ./myscript
실행 가능하다고 가정)?
답변1
./myscript
myscript
Shebang에 지정된 통역사로 실행됩니다 . myscript
실행 가능한 비트를 설정해야 합니다.
bash ./myscript
bash로 실행됩니다 myscript
. myscript
실행할 수 있을 필요가 없으며 bash에는 실행할 파일이 제공되므로 PATH에서 해당 파일을 찾지도 않으므로 bash myscript
잘 작동합니다.
bash -c "./myscript"
./myscript
명령을 실행하기 위해 bash 인스턴스를 시작합니다. 그러면 Shebang에 지정된 인터프리터로 명령이 실행됩니다 (따라서 bash 프로세스가 추가된 첫 번째 경우와 유사합니다). 의 인수는 bash -c
bash 명령 또는 명령 시퀀스(try bash -c "echo 'aa';echo 'bb'"
)입니다.
그리고 당신은 언급하지 않았습니다. ./myscript
답변2
myscript
실행 가능하고 바이너리를 가리키는 shebang 라인이 있다고 가정합니다 . 단독으로 bash
실행하거나 실행하는 것에는 차이가 없지만 실행하면 하위 쉘 수준이 하나 더 생성됩니다. 이는 var( 3 x bash ) 를 확인하여 확인할 수 있습니다../myscript
bash ./myscript
bash -c ./myscript
SHLVL
bash terminal > running bash -c > running shebang line with bash
일반적으로 bash 터미널 세션에 있을 때 ./myscript
shebang 라인을 실행하면 명령을 실행하는 bash
라인이 호출되고 생성됩니다 .bash subshell
30311 pts/0 Ss 0:00 -bash
8419 pts/0 S+ 0:00 \_ /bin/bash ./test.sh
8420 pts/0 R+ 0:00 \_ ps f
SHELL LEVEL: 2 # is 3 when running with bash -c
8419 # that's the $BASHPID
아래 코드(test.sh)를 가져와 직접 시도해 보세요.
#!/bin/bash
ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID