(我在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表示the shell can't find the command。有人会请解释每个案例中发生的事情以及为什么,包括stdout的描述?我特别对#3与????
感到困惑。
答案 0 :(得分:3)
首先你跑:
echo ll > test && chmod +x test
那么这些案件。
案例3:
执行时:
. test
相当于:
source test
source
是一个内置的shell,它告诉shell读取给定的脚本文件并执行当前shell环境中的命令。但是,由于当前路径或.
不在您的路径中,因此使用test
环境变量PATH
找到/bin/test
。
/bin/test
实际上不是source
可以读取/执行的脚本文件;它最终读取二进制文件并输出错误,因为该文件是二进制文件,而不是ascii文本文件和写错误:
????: command not found
当您运行source date
或source ls
时,您将获得相同的行为,因为这些都是二进制文件。
案例1:
您正在执行shell内置test
而没有任何使其以退出值退出的参数:1
案例2:
当您运行./test
时,它会尝试运行ll
并且alias
在衍生的子shell中不可用,因此无法找到别名ll
。由于这一事实,它以退出值退出:127
./test: line 1: ll: command not found
上出现stderr
错误。
案例4:
. ./test
与仅在当前shell中运行的source ./test
相同。因此,它可以找到您之前为ll
设置的别名,因此它会运行别名命令ls -alFh
并退出0