代码之家  ›  专栏  ›  技术社区  ›  jsejcksn

猛击:????:找不到命令

  •  2
  • jsejcksn  · 技术社区  · 8 年前

    ( 我在OSX10.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. . test
      退出代码127
      生产 -bash: ????: command not found

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

    我理解退出代码1是一个通用错误,退出代码127表示 the shell can't find the command 请有人解释一下这些案例中发生了什么,为什么,包括对stdout的描述?我对#3尤其感到困惑 ???? .

    1 回复  |  直到 7 年前
        1
  •  4
  •   tripleee    8 年前

    首先跑步:

    echo ll > test && chmod +x test
    

    然后是这些案例。

    案例3:

    执行时:

    . test
    

    它相当于:

    source test
    

    source 是一个shell内置程序,它告诉shell读取给定的脚本文件并执行 当前shell环境 。然而,自 当前路径 . 不在你的道路上,它发现 test 使用 PATH 环境变量,它是 /bin/test .

    /箱子/测试 不是真正可以读取/执行的脚本文件 来源 ; 它最终读取一个二进制文件并出错,因为该文件是二进制文件,而不是ascii文本文件,并出错写入:

    ????: command not found
    

    当你跑步时,你会得到同样的行为 source date source ls 因为这些都是二进制文件。

    案例1:

    您正在执行shell内置 测验 没有任何参数使其以exit值退出: 1

    案例2:

    当你跑步时 ./test 它试图运行 ll alias 在派生子shell中不可用,因此无法找到别名 陆上通信线 。因此,它以退出值退出: 127 具有 ./test: line 1: ll: command not found 上的错误 stderr .

    案例4:

    . ./test 与相同 source ./test 仅在当前shell中运行的。因此,它能够找到您之前为其设置的别名 陆上通信线 因此它运行别名命令 ls -alFh 并以退出 0