【问题标题】:'which' command is incorrect“哪个”命令不正确
【发布时间】:2015-05-08 20:00:44
【问题描述】:

我的主目录中有一个名为“echo”的 shell 脚本。我将我的主目录添加到我的路径中,以便这个回显将替换另一个。

为此,我使用了:export PATH=/home/me:$PATH

当我执行which echo 时,它会显示我想要的那个。 /home/me/echo

但当我实际执行echo asdf 之类的操作时,它会使用系统回显。

我是不是做错了什么?

【问题讨论】:

  • 您是否尝试过在执行程序之前使用 ./ 来声明它是当前目录中的 bash 文件?如果您不在该当前目录中,您可以将 root 的路径放在 shell 脚本之前。
  • echo 脚本可能不在 CWD 中,这是您可以将其添加到路径中的一个很好的原因。
  • echo是一个shell内置命令。也就是说,根本就没有echo文件,全是bash什么的。
  • which 不是 bash 内置 shell,这意味着它不知道任何可能掩盖磁盘命令的 shell 内置函数。
  • @ÁlvaroG.Vicario:是的,echo 是一个 shell 内置命令,但还有一个外部的 /bin/echo 可执行文件。

标签: shell sh preloading


【解决方案1】:

which 是一个外部命令,因此它无法访问您当前 shell 的内置命令、函数或别名。事实上,至少在我的系统上,/usr/bin/which 是一个 shell 脚本,所以你可以检查它,看看它是如何工作的。

如果您想知道您的 shell 将如何解释命令,请使用 type 而不是 which。如果您使用 bash,type -a 将按优先顺序打印所有可能的含义。有关详细信息,请参阅您的 shell 文档。

对于大多数 shell,内置命令优先于 $PATH 中的命令。例如,内置echo 的全部意义在于它比将/bin/echo 加载到内存中要快。

如果您希望自己的echo 命令覆盖shell 的内置echo,您可以将其定义为shell 函数。

另一方面,覆盖内置的echo 命令并不是一个好主意。如果它的行为与内置的echo 相同,那就没什么意义了。如果没有,那么它可能会破坏使用 echo 并期望它以某种方式工作的脚本。如果可能的话,我建议以不同的方式给你的命令。如果是echo的增强版,你甚至可以称它为Echo

【讨论】:

    【解决方案2】:

    很可能使用了 shell 的内置函数。

    如果你想要你的路径中的那个,你可以这样做

    `which echo` asdf

    【讨论】:

      【解决方案3】:

      来自this little article that explains the rules,这是一个按优先级降序排列的列表:

      1. 别名
      2. Shell 函数
      3. Shell 内置命令
      4. 哈希表
      5. 路径变量

      echo 是一个 shell 内置命令(至少在 bash 中),PATH 的优先级最低。我猜你需要创建一个函数或别名。

      【讨论】:

      • 函数几乎总是比别名好。
      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多