有人能向我解释一下下面两个示例 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.sh
是bash
脚本、文件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 的环境变量。