我正在查看一个用 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”。如果是这样的话,打印的内容是:
现在什么