可能重复:
Difference between launching a script with ./script.sh and . ./script.sh
以./script.sh和。脚本运行脚本有什么区别。 ./script.sh
答案 0 :(得分:4)
源代码(. ./script.sh
)脚本在同一个shell中运行。这意味着,如果它发出exit
,则shell退出,如果它设置了环境变量,则shell会受到影响等。通常,您希望在隔离的子进程(./script.sh
)中运行脚本。
答案 1 :(得分:3)
内置命令.
使脚本在当前进程中运行,而不是在子进程中运行。使用.
允许您的脚本更改当前进程的环境。例如:
$ echo $FOO
$ cat script.sh
#!/bin/bash export FOO="this is foo"
$ ./script.sh
$ echo $FOO
$ . ./script.sh
$ echo $FOO
this is foo
注意在第二种情况下,如何在当前进程中创建环境变量FOO。
以下是处理.
命令的bash手册页部分的链接:
http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_002e-108
答案 2 :(得分:1)
./script.sh
运行脚本。生成一个新的子shell,并在其中运行脚本。脚本对环境所做的任何更改都将是子shell的本地更改。一旦子shell退出,你就不会看到它在父shell中所做的更改。
. ./script.sh
来源于在当前shell中运行的脚本,因此脚本退出后脚本所做的任何环境更改都将保留。
答案 3 :(得分:1)
这就是让它变得有趣的原因:
$ cat script.sh
export HELLO=SIRE
$ ./script.sh
$ set | grep HELLO
$ . ./script.sh
$ set | grep HELLO
HELLO=SIRE
如您所见,添加“。”使脚本在当前shell的上下文中运行,而不是作为单独的进程运行,并影响当前进程的环境以及当前进程附带的所有其他内容。
如果您执行以下操作,这可能会非常有趣:
alias go=". /home/x/bin/navigate_to_location"
然后就这样做:
go sources
go builddir
go games
并且当前环境受到“。”的影响。 ; - )
所以简而言之......“。”让shell值得拥有:)