为什么在echo之前调用env目录?

为什么在echo之前调用env目录?

我正在查看一个用 C 编写的程序。该程序的问题依赖于这行代码。

system("/usr/bin/env echo and now what?");

我知道 system() 只是运行命令。但我只是不确定为什么会这样。

通常它只是“回声,现在怎么办”。但为什么前面要放“usr/bin/env”呢?那到底是做什么的?

答案1

/usr/bin/env后面跟着程序的名称,执行该程序。它在环境变量配置的目录中查找程序名称作为可执行文件PATH。这是使用env:的一种特殊情况env,后面跟着一些环境变量赋值,然后是程序名称和参数 - 这里恰好有零个变量赋值。

/usr/bin/env echo …相当于/bin/echo …,只不过它不会硬编码路径echo- 根据系统和 的值PATH,它可能是/bin/echo, /usr/bin/echo, /usr/xpg4/echo, /usr/ucb/echo, /usr/local/bin/echo, /home/bob/bin/echo, …

几乎每个 shell 都有一个echo内置命令。shell 内置命令和外部命令之间的行为可能存在差异。实际上,echo命令之间在两个方面存在差异:如果第一个参数以以下形式开头-(某些版本的echo处理几个选项)会发生什么,以及如何处理反斜杠(某些版本按字面打印它,其他版本将其视为转义字符) )。因此echo,当您想要使用这些依赖于实现的行为时,强制使用 的版本有时会很有用。在大多数情况下,最好使用它printf—— printf可以做所有echo能做的事情,并且除了古董之外可以随身携带。

使用示例代码中传递的参数,选择 echo 实现并不重要。如果这种疯狂行为有其道理,则需要更多的背景信息才能弄清楚。

答案2

我知道 system() 只是运行命令。

正确的。

通常它只是“回声,现在怎么办”。

你缺少最后一个字符。

但为什么前面要放“/usr/bin/env”呢?

这是命令的完整路径env,然后是执行的命令而不是echo.

那到底是做什么的?

它阻止echo内置函数由函数生成的 shell 执行,system libc因此echo使用首先在 PATH 中找到的可执行文件。根据各自的echo实现,行为可能会有所不同,尽管我在这里没有看到任何特别的东西。在这两种情况下,“现在怎么办?”应该打印,除非您不幸并且有一个以“what”开头的五个字母名称的文件,例如当前目录中的“whatz”。如果是这样的话,打印的内容是:

现在什么

相关内容