在 Windows 上,可以使用
> NUL
将管道重定向到任何内容。在 Linux 上,使用 > /dev/null
。是否有一种跨平台兼容的方法可以将两个平台的管道重定向到任何内容?换句话说,我可以使用它而不必担心命令在哪个平台上执行。
例如,我希望能够将以下命令编写为一个命令。
echo Hello > NUL
echo Hello > /dev/null
当然,任何更复杂的事情都需要单独的脚本。用例是从跨平台语言(例如 Java、Python)执行的单个命令。我想避免检测平台,而是使用通用解决方案。
此外,用例将访问数百台机器,并且安装将比简单地检测平台和调整命令更复杂。
编写一个简单的 C 程序,接受来自 stdio 的所有输入并忽略它。
将您的程序命名为
null
之类的名称,然后将其放入适合您的操作系统的 PATH
中。
然后,你可以这样做:
echo Hello | null
程序编写起来很简单。这不仅仅是“你好世界”。
如果您只对运行命令及其(可能)返回代码感兴趣,为什么不让调用/父应用程序接收并丢弃任何输入呢?它通常涉及设置一个管道或流(例如 for Java)以及可能的一个单独的线程,但它不应该太复杂。
如果您提到您正在启动哪个命令以及原因,这可能会有所帮助。例如,类 Unix 系统上的某些命令有一个特殊的命令行选项,可以抑制大部分输出。
这个问题的最佳解决方案取决于环境。您必须依赖某些东西才能做到这一点。
在原来的问题中,提到了从Python或Java执行。 prushik和Remiguan的答案中提到了使用C程序。我本人就这个问题寻找在 Makefile 中使用的答案(在 Windows 上)。
所有解决方案都适用于 Linux 和 Windows。他们丢弃任何输出到标准输出。输出到 stderr 仍将显示。
请注意,Python、Java 和 C 解决方案都使用管道,这会丢弃退出代码。 检索退出代码又取决于操作系统😢。请参阅:相当于 PIPESTATUS 的批处理文件
使用Python、Java和C的答案都使用了不执行任何操作的程序。您不需要主动丢弃管道输入,只需对其不执行任何操作就足够了 🙂
我认为Python解决方案是最优雅的,其次是Java,C是最不优雅的。当然,除非您已经在 Makefile 中。
安装了 python 后,您可以简单地执行以下操作:
echo Hello | python -c ""
Java 涉及的更多一些。您的工作目录中需要一个最小的 java 程序源。
nullpipe.java
class nullpipe {
public static void main (String args[])
{
}
}
然后你可以使用:
echo Hello | java nullpipe.java
C 解决方案遵循与 Java 解决方案相同的原理,但是这次不能将编译和执行结合起来。
nullpipe.c
int main(){}
执行前需要编译。
gcc nullpipe.c -o nullpipe
然后就可以执行:
echo Hello | nullpipe
之后您可能需要删除
nullpipe
。剩余的可执行文件nullpipe
是我称其为最不优雅的解决方案的原因。
我在 Windows 上运行 make,并认为我需要使用
echo Hello > NUL
,就像 Windows Command Shell 中的正常操作一样。但事实证明,make 是在 bash shell 中执行我的命令(尽管我是从 Windows Command Shell 启动它的)。因此,在 Windows 和 Linux 中您都可以使用。
echo Hello > /dev/null
旁注: 我的 make 版本是使用 Scoop 安装的。如果您的 make 版本表现不同,请在评论中告诉我。我会相应地更新我的答案。
dev-null-cli 包以跨平台的方式为您抽象了这一点。将其添加到您的 devDependency 中,然后您就可以编写
echo Hello | dev-null