bash:???:找不到命令

jse*_*ksn 3 macos bash shell executable

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

我的文件中有这一行.bashrcalias 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

我知道退出代码 1 是一般错误,退出代码 127 意味着shell 无法找到该命令。有人可以解释一下每种情况下发生的情况以及原因吗,包括标准输出的描述?我对 #3 与????.

anu*_*ava 5

首先你运行:

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。因此,它以退出值退出:127with ./test: line 1: ll: command not founderror on stderr

案例4:

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