这里我有一个脚本可以在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
之间的差异是什么?
如果我以超级用户身份运行脚本会怎样?可以. ./
作为超级用户使用运行脚本。
答案 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。