运行脚本/应用程序时“./”和“。”之间有什么区别?

运行脚本/应用程序时“./”和“。”之间有什么区别?

我总是使用./

例如./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方式

相关内容