".myscript"와 "./myscript"의 차이점

".myscript"와 "./myscript"의 차이점

"단지 하나의 점 - 공백 - 쉘 스크립트 이름"(예: . 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.

sourceyes 의 동의어 .입니다. 이는 둘 다 쓸 수 있음을 의미합니다.

. 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

또는 .보더라도 sourceshebang을 읽지 않습니다. 단지 현재 쉘을 사용합니다. 스크립트 자체를 실행하면 오류가 발생합니다.

답변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.shbash에서는 명령으로 처리되므로 . test.sh유효합니다.

관련 정보