jse*_*ksn 3 macos bash shell executable
(我在 OS X 10.11.4 上的终端应用程序中使用 bash 3.2。)
我的文件中有这一行.bashrc
:alias ll='ls -alFh'
我跑去echo ll > test && chmod +x test
创建一个test
可执行文件。以下是运行多个命令的结果、它们的退出代码(通过echo $?
)和stdout
:
test
退出代码 1
不产生标准输出
./test
退出代码 127
产生./test: line 1: ll: command not found
. test
退出代码 127
产生-bash: ????: command not found
. ./test
退出代码 0
产生与手动运行相同的结果ll
我知道退出代码 1 是一般错误,退出代码 127 意味着shell 无法找到该命令。有人可以解释一下每种情况下发生的情况以及原因吗,包括标准输出的描述?我对 #3 与????
.
首先你运行:
echo ll > test && chmod +x test
Run Code Online (Sandbox Code Playgroud)
那么这些案例。
案例3:
当你执行:
. test
Run Code Online (Sandbox Code Playgroud)
它相当于:
source test
Run Code Online (Sandbox Code Playgroud)
source
是一个 shell 内置命令,它告诉 shell 读取给定的脚本文件并在当前 shell 环境中执行命令。但是,由于当前路径不在.
您的路径中,因此它发现test
使用PATH
环境变量/bin/test
.
/bin/test
并不是真正可以通过source
;读取/执行的脚本文件 它最终读取一个二进制文件并出错,因为该文件是二进制文件,而不是 ascii 文本文件,并且写入时出错:
????: command not found
Run Code Online (Sandbox Code Playgroud)
当您运行时,您将得到相同的行为source date
,或者source ls
因为这些都是二进制文件。
情况1:
您正在执行不带任何参数的 shell 内置命令test
,使其以退出值退出:1
案例2:
当您运行时,./test
它会尝试运行ll
,但alias
在生成的子 shell 中不可用,因此它找不到 alias ll
。因此,它以退出值退出:127
with ./test: line 1: ll: command not found
error on stderr
。
案例4:
. ./test
source ./test
与仅在当前 shell 中运行的相同。因此它能够找到您之前设置的别名,因此ll
它运行别名命令ls -alFh
并退出0