"단지 하나의 점 - 공백 - 쉘 스크립트 이름"(예: . myshellscript
) 및 "쉘 스크립트 경로"(예: ) 명령이 ./myshellscript
혼동됩니다 .
그것들은 무엇을 위한 것인가요? 이 명령은 . myshellscript
-rw-rw-r--을 사용해도 쉘 스크립트를 실행한다는 것을 알았습니다 . 그러나 ./myshellscript
그것은 진실이 아니다. 그래서 나는 혼란스러워요.
답변1
help source
설명하다:
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
source
yes 의 동의어 .
입니다. 이는 둘 다 쓸 수 있음을 의미합니다.
. myshellscript
또는
source myshellscript
하는 일: source
파일의 각 줄을 한 줄씩 읽고 현재 셸에서 실행합니다.
하지만./myshellscript
구현하다현재 디렉터리의 파일(권한이 있는 경우) 이것은 또한
/tmp/foo/bar/myshellscript
( myshellscript
실행 디렉토리의 파일 /tmp/foo/bar
) 또는
/usr/local/bin/myshellscript
즉, 여기서 포인트는 간단합니다.현재 디렉터리. 그러면 ./myshellscript
현재 디렉터리에서 호출된 파일이 실행됩니다.myshellscript
예를 들어
cd .
현재 디렉터리로 변경합니다(실제 변경 사항 없음 ;-)) 또는
ls .
현재 디렉토리의 내용을 나열합니다.
@Alvin Wong이 댓글을 달았듯이 이 스크립트를 사용해 볼 수 있습니다.
#!/bin/foobarNonExisting
echo "This is the Shell that executes me:"
echo $SHELL
또는 .
보더라도 source
shebang을 읽지 않습니다. 단지 현재 쉘을 사용합니다. 스크립트 자체를 실행하면 오류가 발생합니다.
답변2
다른 사람들은 조달과 실행의 차이가 있다고 말하지만 아무도 그 차이점을 설명하지 않습니다.기능의차이점.
가장 큰 기능적 차이점은 현재 실행 중인 셸을 가져 exit
오면 cd
및 변수 할당이 현재 실행 중인 셸에 영향을 주지만 실행하는 경우에는 영향을 미치지 않는다는 것입니다. 시연하려면 다음을 시도해 보세요.
$ cat test.sh
#!/bin/bash
mkdir -p test
cd test
pwd
foo=bar
echo script foo: $foo
$ ./test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
$ pwd
/Users/kevin
$ . test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
bar
$ pwd
/Users/kevin/test
$
이제 이것을 시도해 보세요:
$ cat test.sh
#!/bin/bash
exit
$ ./test.sh
$ . test.sh
[Process completed]
보시 exit
다시피 스크립트는 실행된 스크립트 내에서 완료되지만 !를 사용하여 스크립트를 얻으면 exit
현재 쉘이 종료됩니다!
답변3
Bash에서는 .
기능적으로 source
동일한 작업을 수행합니다. 즉, 현재 쉘 내에서 스크립트를 실행합니다.
./foo
쉘이 실행되기 전에 포크되기 때문에 다른 쉘에서 실행하십시오.
스크립트가 이식 가능해야 하는 경우 항상 use .
. source
는 bash의 동의어이지만 POSIX에는 존재하지 않습니다.
답변4
. ~/bin/script.sh
동등한 것을 설명하는 많은 답변이 있습니다 source ~/bin/script.sh
.왜.
테스트할 클러스터가 여러 개 있고 환경 변수를 사용하여 이를 가리킵니다. 일반적으로 스크립트를 실행할 때 그 안에 설정된 모든 변수는 해당 스크립트의 범위 내에 유지됩니다. 예에서:
$ echo $MYFIELD #Nothing set
$ cat test.sh
export MYFIELD=foo #This would set it
$ ./test.sh
$ echo $MYFIELD #Didn't work because the script didn't carry it back to its parent
$ . ./test.sh
$ echo $MYFIELD #When run as a sourced script, this stayed in the context of my current shell
foo
이렇게 하면 . ~/env/cluster7
해당 클러스터에서 원하는 명령을 입력하고 실행할 수 있으며, . ~/env/cluster3
수동으로 설정하지 않고도 모든 환경 변수가 다른 환경 변수를 가리키도록 입력할 수 있습니다.
줄 시작 부분의 "." 뒤에 공백이 있으면 명령으로 해석됩니다. 이런 방식으로 이름을 지정할 수 있는 유일한 파일인 현재 디렉터리를 실행하지 않기 때문에 괜찮습니다. 그러나 다음 공백이 없거나 명령줄 뒤의 어느 지점과 같은 다른 상황에서는 경로를 참조하므로 . ./test.sh
bash에서는 명령으로 처리되므로 . test.sh
유효합니다.