隐藏使用 system() 时使用的控制台命令?C++ Linux

use*_*336 4 c++ linux

好吧,我会说得简单明了:我是一个 C++ 平民。不过仍在努力学习。

我的问题是:是否可以使用 system() 命令通过终端运行命令,而不让命令显示在控制台/终端中?

例子:

system("sudo service sshd start") ;
Output: Sudo service sshd start
Run Code Online (Sandbox Code Playgroud)

我想要的地方:

system("sudo service sshd start") ;
output: (Blank)
Run Code Online (Sandbox Code Playgroud)

注:我在linux上。

ric*_*ici 5

标准system库函数启动一个子 shell,并在该子 shell 中将提供的字符串作为命令执行。(请注意,子 shell 只是一个运行 shell 解释器的进程;所调用的特定 shell 解释器system将取决于您的系统。不使用终端仿真器;至少在 Unix 或类 Unix 系统上不使用。)

system函数在启动子 shell 之前不会重新分配任何文件描述符,因此该命令会使用当前的标准输入、输出和错误分配来执行。许多命令将输出到 stdout 和/或 stderr,并且这些输出不会被system.

如果您希望命令静默执行,则可以在命令本身中重定向 stdout 和/或 stderr:

system("sudo service sshd start >>/dev/null 2>>/dev/null") ;
Run Code Online (Sandbox Code Playgroud)

当然,这将隐藏命令失败可能导致的任何错误消息,因此您应该检查返回值system并提供您自己的错误消息(或记录信息),如果它不为 0。

system这实际上与调用或您从自己的可执行文件中触发子 shell 的事实无关。如果直接输入到 shell 中,相同的命令将具有相同的行为。

  • @marccoll:“&>”是 bash 扩展,并且不能保证“system”调用“bash”。它可能可以在您的机器上运行,但通常不能依赖它。 (5认同)
  • @sopalajo:“>”的语义涉及截断目标文件,并且在某些实现上可能不允许截断“/dev/null”。(在其他系统上,比如 Linux,它默默地不执行任何操作。)因此,通常使用 `>>` 来附加到 `/dev/null`,这保证可以工作。 (3认同)