在使用system()函数时如何隐藏控制台命令?C++ Linux

4

我会简单明了地说:我是一个C++新手,但我还在努力学习。

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

例如:

system("sudo service sshd start") ;
Output: Sudo service sshd start

Where as I want:

system("sudo service sshd start") ;
output: (Blank)

注意:我在使用Linux操作系统。

使用 GNU libc 中的 popen - Henri Menke
我无法重现这个症状。我看到的是命令的输出,而不是命令本身。你是在问如何抑制命令的输出吗?如果是,那与C++无关。 - rici
可能是[在C++中调用“system”时抑制控制台]的重复问题(https://dev59.com/-nI-5IYBdhLWcg3wio5k)。 - CaptainTrunky
1个回答

5
system 标准库函数会启动一个子shell,并在该子shell中执行提供的字符串作为命令。(请注意,子shell只是运行shell解释器的进程;由 system 调用的特定shell解释器将取决于您的系统。没有使用终端仿真器;至少,在Unix或类Unix系统上不会使用。)
system 函数在启动子shell之前不会重新分配任何文件描述符,因此命令会使用当前的标准输入、输出和错误分配。许多命令将输出到stdout和/或stderr,这些输出不会被 system 抑制。
如果您希望命令在执行时保持静默,则可以在命令本身中重定向stdout和/或stderr:
system("sudo service sshd start >>/dev/null 2>>/dev/null") ;

当然,这样做会隐藏任何由于命令失败而产生的错误消息,因此您应该检查system的返回值,并在其不为0时提供自己的错误消息(或记录信息)。 这与system调用或从自己的可执行文件中触发子shell的事实实际上没有太多关系。 如果直接输入到shell中,则相同的命令将具有相同的行为。

你也可以使用 system("sudo service sshd start &> /dev/null");。它更短并且完全相同。 - Marc Coll
5
&> 是 Bash 的扩展语法,不能保证 system 调用的一定是 Bash。它可能在你的电脑上可以工作,但不能普遍依赖。 - rici
工作正常,即使在Code::Blocks IDE调试模式下也是如此。谢谢你。但我正在使用>而不是>>。这样有问题吗? - Sopalajo de Arrierez
3
“>的语义涉及截断目标文件,在某些实现中,截断/dev/null可能不被允许。在其他一些实现中,例如Linux,它会静默地不执行任何操作。因此,惯例是使用>>来将内容附加到/dev/null`,这可以保证正常工作。” - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接