bash: ????: 找不到命令

bash: ????: command not found

(我在 OS X 10.11.4 上的终端应用程序中使用 bash 3.2。)

我的 .bashrc 文件中有这一行:alias ll='ls -alFh'

I 运行 echo ll > test && chmod +x test 创建一个 test 可执行文件。以下是 运行 多个命令的结果、它们的退出代码(通过 echo $?)和 stdout:

  1. test
    退出代码 1
    不产生标准输出

  2. ./test
    退出代码 127
    产生 ./test: line 1: ll: command not found

  3. . test
    退出代码 127
    产生 -bash: ????: command not found

  4. . ./test
    退出代码 0
    产生与手动 运行 ll

  5. 相同的结果

我知道退出代码 1 是一般错误,退出代码 127 表示 the shell can't find the command。请有人解释在每种情况下发生了什么以及为什么,包括标准输出的描述?我对 #3 中的 ????.

特别困惑

首先你运行:

echo ll > test && chmod +x test

然后这些案例。

案例三:

当你执行:

. test

相当于:

source test

source 是一个 shell 内置命令,它告诉 shell 读取给定的脚本文件并在 当前 shell 环境中执行命令。但是,由于 当前路径 . 不在您的路径中,它会使用 PATH 环境变量 /bin/test 找到 test

/bin/test并不是真正的脚本文件,可以被sourceread/executed;它最终读取一个二进制文件并出错,因为该文件是一个二进制文件,而不是一个 ascii 文本文件并且出错写入:

????: command not found

当您 运行 source datesource ls 时,您将得到相同的行为,因为这些都是二进制文件。

案例一:

您正在执行 shell 内置 test,没有任何使其退出的参数,退出值:1

案例二:

当你 运行 ./test 它试图 运行 ll 并且 alias 在生成的子 shell 中不可用因此它找不到别名 ll。由于这个事实,它以退出值退出: 127 with ./test: line 1: ll: command not found error on stderr.

案例四:

. ./testsource ./test 相同,仅当前 shell 中的 运行。因此,它能够找到您之前为 ll 设置的别名,因此它 运行 的别名命令 ls -alFh 并以 0

退出