这两个命令用于运行shell脚本有什么区别?

时间:2012-01-24 04:15:10

标签: linux shell

这里我有一个脚本可以在Linux中导出一些必要的路径。运行此脚本后,我必须运行其他一些脚本。

我有两个脚本

1 import.sh =  importing paths 
2 main.sh   = this script do something with HCI (use for Bluetooth purpose).

当我运行./import.sh而不是./main.sh时,它会给出错误。 当我运行. ./import.sh然后./main.sh时,它运行正常。

那么./import.sh. ./import.sh之间的差异是什么?

如果我以超级用户身份运行脚本会怎样?可以. ./作为超级用户使用运行脚本。

4 个答案:

答案 0 :(得分:4)

两次调用之间的区别在于./import.sh正在执行import.sh作为程序,而. ./import.sh正在shell中对其进行评估。

如果“import.sh”是ELF程序(已编译的二进制文件,而不是shell脚本),则. ./import.sh将无效。

如果import.sh顶部有一个shebang(如#!/bin/perl),那么如果您尝试. ./import.sh,则会遇到令人讨厌的惊喜和大量错误消息 - 除非shebang恰好匹配你当前的shell,在这种情况下它会意外地工作。或者,如果Perl代码以某种方式成为有效的Bash脚本,这似乎不太可能。

. ./import.sh等同于source import.sh,并且不要求文件设置执行位(因为它由已经运行的shell解释而不是通过exec生成) 。我认为这是你的错误的来源。另一个区别是./import.sh在当前shell而不是子shell中运行,因此任何未导出的环境变量都会影响您用于启动的shell!

所以,他们实际上是相当不同的。你通常想要./import.sh,除非你知道自己在做什么并理解其中的差异。

答案 1 :(得分:1)

./import.sh在新的子shell shell中执行shell脚本。

. ./import.sh在当前shell中执行shell脚本 额外的.表示当前的shell。

答案 2 :(得分:0)

./import.sh将脚本作为普通脚本运行 - 也就是说,在子shell中。这意味着它不会以任何方式影响您当前的shell。它应该导入的路径不会在您当前的shell中设置。

额外的.,相当于source,在当前shell的上下文中运行脚本 - 这意味着它可以修改环境变量等(比如你的路径)尝试设置)在当前的shell中。来自bash man page

  

filename [参数]
  来源 文件名 [参数]
  在当前shell环境中从 filename 读取并执行命令,并返回从 filename 执行的最后一个命令的退出状态。

答案 3 :(得分:0)

. ./import.sh“来源”脚本,只需./import.sh执行即可。

前者允许您修改当前环境,后者只会影响子执行中的环境。

前者也相当于(尽管主要是Bash):

source ./import.sh

help source收益:

  

source: source filename [arguments]

     

从当前shell中的文件执行命令。

     

从当前shell中的FILENAME读取并执行命令。该   $ PATH中的条目用于查找包含FILENAME的目录。   如果提供任何ARGUMENTS,它们将成为位置参数   执行FILENAME时。

     

退出状态:   返回在FILENAME中执行的最后一个命令的状态;如果失败了   无法读取FILENAME。