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

zip*_*zap 13 command-line executable

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

我已经知道前者让 shell 在当前目录 ( .) 中查找 an_executable ,但是为什么在使用后一个版本/后不需要 a.呢?

提前致谢。

roa*_*dmr 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.
Run Code Online (Sandbox Code Playgroud)

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

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

查看其行为的一种非常简单的方法是编写一个仅包含exit. 如果您使用./script它,似乎什么都不会发生,这是因为启动了一个新的 shell 进程,该exit命令退出了那个新的shell,并且您当前的 shell 不受影响。

如果你. script,你当前的终端将关闭,因为该exit命令在当前的 shell 中运行。所以它相当于exit在命令提示符下键入。

  • 因为虽然子shell 是一个单独的*进程*,但它使用与调用shell 相同的*终端*。这类似于您仍然能够看到 `ls` 输出的方式:您输入命令,它运行,显示输出然后结束,但输出保留在终端中。 (2认同)
  • 不要将 shell 与终端混淆;它们是不同的东西。打开终端,命令提示符由运行在其中的“bash”外壳给出。如果你输入`bash`,你将运行*另一个* shell;对于第一个 shell,它只是一个要运行的程序。如果你输入`exit`,你会关闭你启动的*last* shell,但仍然在第一个shell(从你启动终端开始的那个)。同样,这一切都发生在同一个终端内。 (2认同)