使用 ./bla.sh 与 . bla.sh 调用脚本

使用 ./bla.sh 与 . bla.sh 调用脚本

有人能向我解释一下下面两个示例 A) 和 B) 中的 shell 做了什么吗?它的行为显然不同,但我找不到输出不同的原因。

示例:
我们在当前目录中创建一个bla.sh仅用一个命令命名的脚本:
echo ${0##/*} hello

A)
开始于:./bla.sh
得到:./bla.sh hello

B)
开始于:. bla.sh
给出:-bash hello

由于我在脚本中使用了这个,所以第二个输出(因为 -bash 前面有“-”)会终止该命令。当然,在帮助--之前有一个 simple ${...},但我很想首先了解是什么导致了输出。
我喜欢 bash。还有 vi[m]。但我离题了……

答案1

./bla.sh

此处的命令为./bla.sh。这会让 shell 查找bla.sh当前目录中的可执行文件,然后要求内核将其作为普通程序在与 shell 不同的进程中运行。(无论bla.shbash脚本、文件perl还是python编译后的二进制文件,都没有关系。)


. bla.sh

此处的命令.(又名source) 是 shell 的内置命令。它使 shell 查找bla.sh系统路径 ($PATH) 中命名的文件,并解释其内容,就像您输入的一样;所有这些都是在相同的过程作为 shell 本身(因此可以影响 shell 的内部状态)。

当然,这只有当bla.sh包含 shell 命令时才有效(如果这是您当前正在使用的命令),它对脚本或其他任何东西bash都不起作用。perl

help .(和中也解释了这一点help source。)


由于和../完全不同的东西(命令与路径的一部分),当然,它们可以组合在一起——使用将在当前目录中. ./bla.sh“获取”一个文件。bla.sh


通常最好使用./bla.sh方法。只有~/.bashrc~/.profile并且这样的文件通常是源文件,因为它们应该修改当前环境。

答案2

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

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

答案3

./cmd 使用显式路径 ( ./-current dir) 指向可执行文件。并且它不必以 开头#!

. cmd- (又名source) - bash 内置命令。通过执行的一个明显区别source是它可以设置/修改当前 shell 的环境变量。

相关内容