Linux 可执行文件与可执行文件之间的差异。可执行

Linux 可执行文件与可执行文件之间的差异。可执行,linux,bash,shell,executable,Linux,Bash,Shell,Executable,在壳中,两者之间有什么区别 . executable 及 在第一个例子中,圆点是一个快捷方式,对吗?因此,/executable和源可执行文件之间有区别吗?在第二个文件中,您给出了路径:/是当前工作目录,因此它不会在路径中搜索可执行文件,而是在当前目录中搜索 source将可执行文件作为参数,并在当前进程中执行。/executable运行当前工作目录中的可执行文件。(可执行文件如果在$PATH中没有,并且通常没有,是不够的)。在这种情况下,可执行文件可以是elf二进制文件,也可以是以开头的脚本

在壳中,两者之间有什么区别

. executable


在第一个例子中,圆点是一个快捷方式,对吗?因此,
/executable
源可执行文件
之间有区别吗?

在第二个文件中,您给出了路径:
/
是当前工作目录,因此它不会在
路径
中搜索可执行文件,而是在当前目录中搜索


source
将可执行文件作为参数,并在当前进程中执行。

/executable
运行当前工作目录中的可执行文件。(
可执行文件
如果在
$PATH
中没有
,并且通常没有,
是不够的)。在这种情况下,
可执行文件
可以是elf二进制文件,也可以是以
开头的脚本/一些/解释器
,或者任何你能执行的东西(在Linux上,它可能是一切,多亏了
binfmt
模块)

。可执行文件
将shell脚本源代码导入当前shell,无论它是否具有执行权限。没有创建新进程。在
bash
中,根据
$PATH
变量搜索脚本。脚本可以设置环境变量,这些变量将在shell中保持设置,定义函数和别名等

/可执行文件和源可执行文件之间有区别吗

基本区别是,

./foo.sh      - foo.sh will be executed in a sub-shell
source foo.sh - foo.sh will be executed in current shell
一些例子有助于解释这种差异:

假设我们有
foo.sh

#!/bin/bash
VAR=100
资料来源:

$ source foo.sh 
$ echo $VAR
100
$ source bar.sh
<your terminal exits, because it was executed with current shell>
如果你:

./foo.sh
$ echo $VAR
[empty]
另一个例子,
bar.sh

#!/bin/bash
echo "hello!"
exit 0
如果按如下方式执行:

$ ./bar.sh
hello
$
但如果你找到它的来源:

$ source foo.sh 
$ echo $VAR
100
$ source bar.sh
<your terminal exits, because it was executed with current shell>
$source bar.sh

这就是为什么首选使用./executable,因为您不想在执行另一个可执行文件的情况下运行?
source
不会启动子进程。您可以使用..在当前目录中生成文件/可执行。@choroba更正的源代码强制在当前进程中执行您是对的您确定是“子shell”吗?这不是一个子进程吗?该文件可能不是一个shell脚本,那么它怎么可能是一个子shell呢?