使用 ./bla.sh 与 . 废话

Wol*_*olf 11 unix script bash

有人可以向我解释 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.shbash脚本、一个perlpython一个,还是编译后的二进制文件都无关紧要。)


. 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并且这些文件通常是来源,因为它们应该修改当前环境。

  • 此外,如果您在 bla.sh 中更改 bash 环境,这些更改会在 . bla.sh 但不是在 ./bla.sh 之后。这是因为 。bla.sh 在当前 bash 的上下文中运行,而 ./bla.sh 作为子进程运行。 (3认同)

kmk*_*lan 7

./<cmd><cmd>在新(分叉)进程中执行驻留在当前目录中的程序。它必须是可执行的。并且可读,它以#!.

. <cmd>将使您的当前 shell 执行<cmd>驻留在您$PATH当前shell 进程中的当前目录中的shell 脚本。它必须是可读的。它是 shell 命令的别名source