./vs。用于在终端下运行程序


13

我需要对我们在终端下运行可执行文件的方式进行一些说明。这可能是一个la脚的问题,但是使用./an_executable和运行可执行文件有什么区别. an_executable(假设我们位于an_executable所在的目录中)

我已经知道,前者使外壳程序在当前目录(.)中寻找an_executable ,但是为什么在使用后者版本/后为什么不需要它.呢?

提前致谢。


Answers:


22

. executable语法仅对任何可执行文件都无效(或者对吗?)。相反,它是source内置bash的别名。所以区别主要与bash脚本有关,事实是它们是完全不同的东西:)

./executable要求“正常”运行可执行文件。./是相对于当前路径的参考。这样可以避免shell(bash)尝试将可执行文件放置在其目录中$PATH(如果您根本没有使用命令指定路径,则可以这样做)。您不能做的原因executable是安全性之一;想象您解压缩了下载的存档,其中包含的恶意版本ls。如果它直接从您的当前目录运行,则您将在没有意识到的情况下运行该版本。

另一方面,. executable就是说“源文件名为executable”。由于您是直接命名文件,实际上它不一定是可执行文件,因此$ PATH的安全限制不适用。采购将仅“运行”(或似乎运行)shell脚本。它的作用是:

   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.

那么...执行和采购之间真正的区别是什么?假设使用相同的shell脚本,执行该脚本(./script)将产生一个新的shell,在该shell中运行该脚本,并且当脚本退出时,关闭该shell并返回到父shell。实际上,它将启动一个新bash进程来执行脚本。

. script)将导致当前 shell从文件中读取命令,就像在命令行中键入命令一样。没有新的外壳产生。

观察其行为的一种非常简单的方法是编写仅包含的脚本exit。如果是./script这样,似乎什么也不会发生,这是因为启动了新的Shell进程,exit命令退出了该 Shell,并且当前的Shell不受影响。

如果您使用. script,则当前终端将关闭,因为该exit命令在当前shell中运行。因此,这等效exit于在命令提示符下键入。


确实,当我注意到这种行为时,我正在处理shell脚本。非常感谢,这就是我需要的答案。:)
zipzap 2015年

提出了另一个问题(如果您不介意的话):如果我的脚本仅包含一些带有回显的简单消息,而我正在使用./script运行它,那么如果子壳关闭,为什么我能在父壳中看到消息一旦执行结束?
zipzap

2
因为虽然子外壳程序是一个单独的进程,但是它使用与调用外壳程序相同的终端。这类似于您仍然能够看到ls输出的方式:键入命令,命令运行,显示输出,然后结束,但输出仍保留在终端中。
roadmr 2015年

2
不要将shell与终端混淆。他们是不同的东西。打开一个终端,命令提示符由其中bash运行的shell 给出。如果输入bash,将运行另一个 shell;对于第一个shell,这只是一个要运行的程序。如果键入exit,则将关闭您启动的最后一个外壳,但仍位于第一个外壳(启动终端时的外壳)中。同样,这一切都发生在同一终端内。
roadmr

1
@DavidZ我确实提到了它:)“采购只会“运行”(或似乎运行)shell脚本。”
roadmr 2015年
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.