名为“test”的可执行文件在 $PATH 中,但不会运行

Con*_*nda 13 bash path executable shell-script strace

我在 $HOME/bin 中有一个文件(在你问之前,是的,它在我的路径中)test我已经确认当我使用文件的完整路径运行它时可以正常执行。但是,当我不以这种方式运行时,我会遇到一个非常奇怪的问题。当我test在终端中运行时,它什么也不做并立即返回。我知道这不是查找文件的问题,原因如下:

  1. 没有错误信息。通常,如果找不到文件或无法执行文件,则会打印出一条消息。

  2. 运行which test仍然返回正确的文件路径。

  3. 可能是最奇怪的 - 脚本在运行时运行良好strace。我试着用strace看看我是否能弄清楚发生了什么,但是当我用 运行它时strace,它按预期工作,有 0 个问题。

ilk*_*chu 45

test使用起来很不幸,它是条件测试标准实用程序。(它实际上是与in相同的命令,它只是看起来像一个语法的东西,但实际上只是一个普通的命令。)[if [ ... ]

test也内置在例如 Bash 中,因此运行时test永远不会从路径中查找您的二进制文件。

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]
Run Code Online (Sandbox Code Playgroud)

test 没有参数只返回 1 (false)。

运行strace test不涉及内置的 shell,因为strace它本身不实现任何实用程序。它只是使用它在您的PATH. 请注意,您可能test/bin/testor 中有标准/usr/bin/test,因此如果它是第一个 in PATHstrace则会运行 run 。

在我的 Bash 上,which也是一个外部命令,所以它也不知道内置命令。另一方面,type命令内置于 shell 中,并且type test会显示test is a shell builtin.

另请参阅:为什么不使用“which”?那用什么?

  • [有一个 1985 年的轶事](https://groups.google.com/d/msg/net.unix-wizards/geTFOFt4a9Y/BTnSRgX1E5AJ)。 (12认同)