【问题标题】:Hiding console command used while using system()? C++ Linux隐藏使用 system() 时使用的控制台命令? C++ Linux
【发布时间】:2017-05-17 01:34:56
【问题描述】:

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

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

例子:

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

随心所欲:

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

注意:我在 linux 上。

【问题讨论】:

  • 使用来自 GNU libc 的popen
  • 我无法重现该症状。我看到的是命令的输出,而不是命令本身。您是在问如何抑制命令的输出?如果是这样,它与 C++ 无关。

标签: c++ linux


【解决方案1】:

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");。它更短,并且完全相同。
  • @marccoll: &> 是一个 bash 扩展,不能保证 system 调用 bash。它可能在您的机器上工作,但一般不能依赖它。
  • 工作正常,即使在 Code::Blocks IDE 调试模式下。谢谢。但我使用的是> 而不是>>。有什么问题吗?
  • @sopalajo:> 的语义涉及截断目标文件,在某些实现中,可能不允许截断 /dev/null。 (在其他系统上,比如 Linux,它默默地什么都不做。)所以通常使用>> 来附加到/dev/null,这样可以保证工作。
猜你喜欢
  • 2017-09-21
  • 2010-12-08
  • 1970-01-01
  • 2014-09-27
  • 2020-05-31
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多