【问题标题】:Output redirection from awk fails when executed from std::system call从 std::system 调用执行时,来自 awk 的输出重定向失败
【发布时间】:2015-08-11 22:14:05
【问题描述】:

从 C++ 程序运行此命令时:

std::system("p4 print //perforce/path/to/file/configurations.json | grep -m 1 Configuration | awk '{sub(/,/, \"\"); sub(/\"/, \"\"); print $2}' > output.txt");

在调用 awk 之前,该命令似乎正常工作,grep 命令输出预期的字符串,但 awk 命令失败并显示以下错误消息:

awk: cmd. line:1: fatal: cannot open file '>' for reading (No such file or directory)

Awk 似乎将输出重定向运算符解释为输入文件的名称。

由于某种原因,在 Cygwin 下的 Windows 上执行时会出现此错误,但在 Linux 上执行时可以正常工作(分别使用 MSVC 12 和 gcc/4.8.1 编译)。

【问题讨论】:

  • 您是否考虑过使用 MinGW,并从系统运行类似 UNIX 的 shell?
  • 我使用的是 Cygwin,所以我可以访问 UNIX 实用程序。
  • 请注意,您可以将grep | awk 变成awk '/Configuration/ {gsub(/[,\"]/, \"\", $2); print $2; exit}'

标签: c++ linux windows bash awk


【解决方案1】:

'>' 和 '|'运算符是 shell 的函数。

从这里到那里的最简单方法是将整个命令字符串作为 shell 命令执行。即std::system("cygwin/bin/bash -c \"command_string...\"")

只是为了澄清:进行“系统”调用时将使用默认命令外壳。在 Linux 系统中,这将是“bash”。在 Windows 中,它将是“cmd”(这不是您想要的)

【讨论】:

  • 我很惊讶 Cygwin libc 不默认为 bash。 (或者可能是这样,并且 OP 没有用 Cygwin g++ 编译。我想知道......)
  • Cygwin 可以安装在任何地方,所以库不一定知道它的位置。
  • 谢谢。使用 sh -c "..." 从 Windows cmd 命令外壳运行时,它似乎可以正常工作。我仍然不明白为什么直接从 cmd 运行该命令不起作用,因为我可以毫无问题地使用 awk 和该 shell 中的输出重定向运算符 ('>')。
猜你喜欢
  • 2018-04-05
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2014-09-06
  • 2016-01-15
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多