(我在 OS X 10.11.4 的终端应用程序中使用 bash 3.2。)
我的 .bashrc
文件中有这一行:alias ll='ls -alFh'
我运行 echo ll > test && chmod +x test
来创建一个 test
可执行文件。以下是运行多个命令的结果、它们的退出代码(通过 echo $?
)和 stdout
:
测试
退出代码 1
不产生标准输出./test
退出代码 127
产生./test: line 1: ll: command not found
。测试
退出代码 127
产生-bash: ????: command not found
。 ./测试
退出代码 0
产生与手动运行ll
相同的结果
我知道退出代码 1 是一般错误,退出代码 127 表示 the shell can't find the command .请有人解释在每种情况下发生了什么以及为什么,包括标准输出的描述?我对 #3 中的 ????
特别困惑。
最佳答案
首先运行:
echo ll > test && chmod +x test
然后是这些情况。
案例三:
当你执行时:
. test
相当于:
source test
source
是一个 shell 内置命令,它告诉 shell 读取给定的脚本文件并在当前 shell 环境 中执行命令。但是,由于 current path 或 .
不在您的路径中,它会使用 PATH
环境变量找到 test
/bin/测试
。
/bin/test
并不是真正可以被source
读取/执行的脚本文件;它最终读取一个二进制文件并出错,因为该文件是一个二进制文件,而不是一个 ascii 文本文件,并出错写入:
????: command not found
当您运行 source date
或 source ls
时,您将获得相同的行为,因为这些都是二进制文件。
案例 1:
您正在执行 shell 内置 test
,没有任何使其退出的参数:1
案例 2:
当您运行 ./test
时,它会尝试运行 ll
并且 alias
在生成的子 shell 中不可用,因此它找不到别名会
。由于这个事实,它以退出值退出:127
和 ./test: line 1: ll: command not found
stderr
错误。
案例 4:
。 ./test
与仅在当前 shell 中运行的 source ./test
相同。因此,它能够找到您之前为 ll
设置的别名,因此它运行别名命令 ls -alFh
并以 0
关于bash: ????: 找不到命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37087988/