用./bla.sh vs.调用脚本。bla.sh


11

有人可以在下面的两个示例A)和B)中向我解释外壳的作用吗?它的行为显然有所不同,但我无法弄清输出为何不同。

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

A)
开始为:./bla.sh
给出:./bla.sh hello

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

由于我在脚本中使用了此命令,因此第二个输出(由于-bash前面的“-”)会终止该命令。当然,--在获得${...}帮助之前很简单,但是我很想首先了解导致输出的原因。
我喜欢bash。和vi [m]。但是我离题了……

Answers:


22
./bla.sh

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


. bla.sh

在这里,该命令是.(aka source),是Shell的内置命令。它使外壳程序bla.sh在系统路径($ PATH)中查找一个文件,并将其内容解释为您键入的内容。所有这些操作都是在外壳本身相同的过程中完成的(因此可能会影响外壳的内部状态)。

当然,这仅在bla.sh包含用于bashshell的命令(如果您当前正在使用的命令)时才起作用,而不适用于perl脚本或其他任何命令。

(这是在解释help .help source也。)


由于../是完全不同的事物(命令与路径的一部分),因此可以将它们组合在一起-使用. ./bla.sh将“获取” bla.sh当前目录中的文件。


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


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

1
有关某些示例,另请参见mywiki.wooledge.org/BashFAQ/060。请注意,这source是bash的别名.,并非相反,并且source在其他shell中不起作用。
mrucci

7

./<cmd><cmd>在新的(分支的)进程中执行驻留在当前目录中的程序。它必须是可执行的。而且可读性也始于#!

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


-1 . <cmd>将在其中查找程序$PATH,如果找不到,则它将在当前目录中查找。
dogbane 2012年

@dogbane对,我更正了。
kmkaplan 2012年

FWIW,并非所有的shell都会在cwd中搜索源代码。zsh(至少具有我的配置)要求. ./cmd
bstpierre 2012年

1
@bstpierre这似乎是一个动态的领域。我曾经说过的POSIX参考资料是:“外壳程序应使用PATH指定的搜索路径”,并且“即使PATH的值不允许,某些较旧的实现也会在当前目录中搜索该文件。”
kmkaplan 2012年

1

./cmd 使用显式路径(./-当前目录)执行。并且它不必以开头#!

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


更精确地说,source.(仅是bash的)别名(这是标准的)
user1686

你是对的。固定。
Leonid Volnitsky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.