bash: ????: 命令未找到。

3

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

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

我运行了echo ll > test && chmod +x test来创建一个可执行的test。下面是运行多个命令的结果,它们的退出代码(通过echo $?),和标准输出:

  1. test
    退出代码1
    没有产生stdout

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

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

  4. . ./test
    退出代码0
    与手动运行ll产生相同的结果

我知道退出代码1是通用错误,退出代码127意味着shell无法找到该命令。请问有人能够解释每种情况下都发生了什么以及为什么,包括对stdout的描述吗?我特别困惑于第3种情况中的????


就记录而言,我的路径没问题。@sjsam,没有必要点踩——显然你没有完全阅读我的问题,并将其与你提供的任何结果进行比较。 - undefined
如果您创建了test,关闭了终端,启动了一个新的终端会话,并按照您给出的顺序执行命令,会发生什么? - undefined
@sjsam 结果是相同的。 - undefined
这可能是因为当前的shell会话是使用旧版本的.bashrc启动的。你可以在test中添加一个shebang来解决第二种情况,我猜.. 你可以使用type ll来检查别名是否正常工作。 - undefined
@sjsam 我将文件复制为test2,并将#!/bin/bash添加为shebang,但仍然没有任何区别。 - undefined
显示剩余2条评论
1个回答

5

首先运行以下命令:

echo ll > test && chmod +x test

接下来是这些案例。

案例3:

当您执行以下操作时:

. test

这相当于:

source test
source 是一个 shell 内置命令,它告诉 shell 读取给定的脚本文件并在当前 shell 环境中执行命令。然而,由于 当前路径 或者 . 不在你的路径中,它通过 PATH 环境变量查找 test ,找到的是 /bin/test/bin/test 实际上不是一个可以被 source 读取和执行的脚本文件;它最终会读取一个二进制文件并报错,因为该文件是一个二进制文件,而不是 ASCII 文本文件,并且在写入时报错:
????: command not found

当您运行source datesource ls时,您将获得相同的行为,因为它们都是二进制文件。
案例1: 您执行shell内置的test而没有任何参数,使其以退出值1退出。
案例2: 当您运行./test时,它尝试运行ll,但在生成的子shell中不可用alias,因此它无法找到别名ll。由于这个事实,它会在stderr上显示./test: line 1: ll: command not found错误,并以退出值127退出。
案例4: . ./testsource ./test相同,仅在当前shell中运行。因此,它能够找到您先前为ll设置的别名,因此运行别名命令ls -alFh并以0退出。

这部分解决了第三个问题,但它并没有回答我的问题:对每一个问题都需要有解释。它也没有涵盖输出中????的原因(例如,与-bash: test: command not found相比)。 - undefined
它解释了输出中的????的原因(读取二进制文件/bin/test)。 - undefined
当我运行另一个不存在的命令,例如marcopolo,我会得到"-bash:marcopolo:找不到命令"(退出码127)。 - undefined
我很感激你的回复,但是关于第四个案例你所说的并不正确——它确实成功并以代码0退出。你是在OS X上进行测试吗? - undefined
1
太好了,这就是我需要的信息。谢谢! - undefined
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接