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

时间:2016-05-07 11:29:44

标签: bash macos shell executable

我在OS X 10.11.4的终端应用中使用bash 3.2。

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

我运行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。有人会请解释每个案例中发生的事情以及为什么,包括stdout的描述?我特别对#3与????感到困惑。

1 个答案:

答案 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 datesource 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