有人可以向我解释 shell 在下面的两个示例 A) 和 B) 中的作用吗?它显然表现不同,但我无法找出输出不同的原因。
示例:
让我们在当前目录中创建bla.sh一个仅使用一个命令命名的脚本:
echo ${0##/*} hello
A)
开始为:./bla.sh
给出:./bla.sh hello
B)
开始为:. bla.sh
给出:-bash hello
由于我在脚本中使用它,因此第二个输出(因为 -bash 前面的“-”)会终止该命令。当然,--在${...}帮助之前简单,但我很想首先了解导致输出的原因。
我喜欢 bash。和 vi[m]。但我离题了……
use*_*686 22
./bla.sh
Run Code Online (Sandbox Code Playgroud)
在这里,命令是./bla.sh。这使得 shell 查找bla.sh在当前目录中命名的可执行文件,然后要求内核在与 shell 不同的进程中将其作为普通程序运行。(无论bla.sh是bash脚本、一个perl或python一个,还是编译后的二进制文件都无关紧要。)
. bla.sh
Run Code Online (Sandbox Code Playgroud)
在这里,命令是.(又名source),是您的 shell 的内置命令。它使 shell 查找bla.sh在系统路径 ($PATH) 中命名的文件,并将内容解释为由您键入;所有这些都是在与shell 本身相同的过程中完成的(因此会影响 shell 的内部状态)。
这当然仅适用于bla.sh包含bashshell命令(如果这是您当前使用的命令),它不适用于perl脚本或其他任何东西。
(这在help .和 中help source也有解释。)
由于.和./是完全不同的东西(命令与路径的一部分),它们当然可以组合使用——使用. ./bla.sh将“源”bla.sh当前目录中的文件。
通常最好使用该./bla.sh方法。Only ~/.bashrc,~/.profile并且这些文件通常是来源,因为它们应该修改当前环境。
./<cmd>将<cmd>在新(分叉)进程中执行驻留在当前目录中的程序。它必须是可执行的。并且可读,它以#!.
. <cmd>将使您的当前 shell 执行<cmd>驻留在您$PATH或当前shell 进程中的当前目录中的shell 脚本。它必须是可读的。它是 shell 命令的别名source。