查看下面的代码,它只是将 c 或 c++ 文件(例如)转换main.cpp
为预处理后的状态,例如main_pp.cpp
。
但是,运行它生成的命令g++ -E "main.cpp" > "main_pp.cpp"
在命令行上就可以正常工作。
确切的错误是g++: error: >: Invalid argument
,所以显然它没有看到不是>
参数列表的一部分。
cd "$(CURRENT_DIRECTORY)"
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
有人知道为什么 NppExec 的行为与标准命令行不同吗?
答案1
输出重定向>
和管道传输|
都是由命令行解释器负责的。在 Windows 中,cmd.exe
是命令行解释器。因此,
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
用这个:
cmd /C g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
答案2
简短的回答是,命令行解释器的功能远不止执行其他程序,使用程序输出重定向>
或通过管道传输输出等|
都是命令行解释器提供的功能,因此 NppExec 需要模拟它才能工作。
更准确的答案是,您通常使用以下方式在 Windows 中启动新进程CreateProcess()
和相关函数,尽管你可以重定向新进程的输出,但并不像使用那么简单>
。你需要打开句柄到文件并将其传递到STARTUPINFOA
使用适当的标志。
因此,为了支持>
重定向,NppExec 需要解析该行以将该部分与应用程序和参数分开,这可能很棘手,而且还需要考虑到您可以重定向到非文件的其他东西,例如打印机。
这并非不可能,而且似乎 NppExec 会进行一些基本解析,因为在您的示例中,您使用的cd
也是由命令行解释器提供的。但这可以简单到只需检查一行的前两个非空格字符是否为“cd”,然后使用行的其余部分进行更改当前目录。
我还怀疑 NppExec 甚至没有解析该行以将应用程序与参数分开。我认为它只是替换变量并利用允许CreateProcess()
省略应用程序参数的事实,因此它可以将整行作为命令行参数传递(至少我会这样做 :-)。
最后,在 Unix/Linux 中,程序只是将结果输出到标准输出,期望您将其重定向到文件或通过管道传输到另一个程序,这种现象更为常见(g++ 似乎是 GNU 的一部分,而 GNU 最初是为 Unix 创建的)。在 Windows 中,更常见的是使用参数来指定输出文件,因此如果您不使用“Linux 风格”的程序,支持重定向并不是您认为的首要任务(甚至根本不会考虑)。