我总是使用./
例如./script.sh
我最近了解到你也可以输入. script.sh
有什么区别吗?
第二种方法对我来说更容易,因为我的键盘没有 / 键,但我需要按SHIFT -
。
答案1
执行此操作时,./script.sh
脚本将在子 shell 中运行。因此,脚本要执行的任何操作/更改均在子 shell 中进行,因此父 shell(即调用脚本的 shell)不会受到更改的影响。
另一方面,当您执行此操作时. script.sh
(.
与 shell 内置相同source
),脚本是源,这意味着所有命令都在此 shell 实例(从中调用)中执行。因此,任何属性(例如变量、函数声明)的更改都会影响 shell。
通常source
用于用户配置文件,例如~/.bashrc
对其进行任何修改之后(例如,向中添加新路径)PATH
,以便从当前 shell 会话应用更改。
也许一个例子会让你更清楚:
$ cat script.sh ##Our test script, containing just a variable (spam) declaration
#!/bin/bash
spam=foobar
$ ./script.sh ## Execute using ./script.sh
$ echo "$spam" ## Prints nothing
$ . script.sh ## Lets source it
$ echo "$spam" ## Now we get it
foobar
答案2
两者都执行位于您所在目录(即当前工作目录)中的脚本。
做. script
被称为寻找剧本在bash
从http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x237.html
当文件被加载时(通过在命令行中输入源文件名或 . 文件名),文件中的代码行将被执行,就像它们是在命令行中打印出来的一样。这对于复杂的提示尤其有用,允许它们存储在文件中并通过加载它们所在的文件来调用。
在示例中,您会发现我经常在包含函数的文件开头包含 #!/bin/bash。如果您要获取文件,则无需这样做,就像无需 chmod +xa 要获取的文件一样。我这样做是因为它会让 Vim(我选择的编辑器,请不要喷人 - 您使用您喜欢的编辑器)认为我正在编辑 shell 脚本并打开彩色语法突出显示。
需要注意的是:脚本的执行方式如下在命令行中输入,这意味着它需要bash
语法。因此,如果您当前正在工作bash
并且想要执行以tcsh
样式编写的脚本,bash 将会抱怨。相反,如果您. bashstylescript.sh
这样做,则会成功。
这是一个演示。cwhile.sh
很时尚tcsh
,也whileloop.sh
很有bash
风格。
serg@ubuntu [/home/xieerqi]
================================
$ . cwhile.sh
bash: cwhile.sh: line 8: syntax error: unexpected end of file
serg@ubuntu [/home/xieerqi]
================================
$ . whileloop.sh
28206
33672
18406
65344
12022
10751
29707
44303
15081
59236
那么怎么样./script
?在这种情况下,shell 将读取#!
行,并运行适当的 shell 来执行您的脚本。
serg@ubuntu [/home/xieerqi]
================================
$ ./cwhile.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
正如你所看到的,shell 读取了我的#!/bin/tcsh
行并tcsh
执行了脚本。
边注:. script.sh
在其他 shell 中执行此操作可能不起作用,因为这似乎是 bash 唯一的事情。mksh
例如,它不这样做,而是使用source script.sh
方式