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

标签 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. 测试
    退出代码 1
    不产生标准输出

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

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

  4. 。 ./测试
    退出代码 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 环境 中执行命令。但是,由于 current path. 不在您的路径中,它会使用 PATH 环境变量找到 test /bin/测试

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

????: command not found

当您运行 source datesource 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/

相关文章:

linux - 循环 fork()

regex - 我需要通过 shell 脚本评论一个具有精确模式匹配的文件

bash - 检查网页是否已更新的简单脚本

linux - 用从另一个文件复制的内容替换文件中的字符串

python - 在 OSX 10.10 上链接 Boost Python

bash - 在不使用 stderr 的情况下将 stdout 重定向到文件后写入终端?

macos - RAM 中的音频文件并播放 - Bash 4.3.42

arrays - 巴什脚本。如何在 bash 脚本中编码 if (array=nothing) then echo "no element in array"

node.js - 在 mac os x 上安装 MEAN 时出错

objective-c - NSView - 如何在不重绘父 View 的情况下重绘 subview