提供C程序的输出作为命令行输入Java程序?

提供C程序的输出作为命令行输入Java程序?

我正在学习 Unix 文件系统并了解了管道。根据极客之极客,

管道保存第一个命令的输出,直到第二个程序读取它为止

所以,我在想如果我可以关联AC程序和一个Java程序以便提供 C 代码的输出作为 Java 代码的命令行参数。

这是我的代码:

抄送

#include <stdio.h>
int main(){
    printf("World");
    return 0;
}

Java.java

public class Java{
    public static void main(String[] a){
        System.out.println("Hello "+a[0]); 
    }
}

我尝试链接 C 对象文件执行命令和 Java 类执行命令,以便输出结果为:

Hello World

这是我尝试过的:

gcc -o c c.c
javac Java.java

./c | java Java

事情没有按我的预期进行。 Java程序没有收到C程序的输出,只是抛出异常ArrayIndexOutOfBounds。另外,我没有看到C程序的输出。

如果可能的话,我怎样才能实现我的目标?

答案1

你想要的事情是可能的,但并不像你尝试的那么容易。正如您正确指出的那样,管道提供输入,而不是命令行参数。

幸运的是,有一个(标准)程序可以做到这一点:xargs

在 GNU 世界 (Linux) 中,最好的方法是用文字零字节分隔输出元素:

/your/c/program | xargs --no-run-if-empty -0 /your/java/program

您可以轻松地尝试使用echo(无论如何,这是默认命令)xargs

echo '/bin
/etc
/usr' | xargs ls -ld

答案2

你想要的都是可能的,而且很容易。只需输入

/your/java/program "$(/your/c/program)"

这种$(…)表示法称为“命令替换”。  运行时将输出输出到管道,捕获它,并将其放在命令行上。所以$(command1)command1

命令2$(命令1
使用 的输出作为命令行参数运行。您应该添加引号 ( ) 来处理输出 (即您的 C 程序)是多个单词的情况(例如,)。这就是你所要求的。command2command1"…"command1printf("planet earth");

我详细讨论了这个问题这里,我在其中展示了示例

$ ls -ld "$(日期 "+%B %Y").txt"
-rwxr-xr-x 1用户名 组名    第687章 2018年4月2日11:09.txt

PS 如果您使用的是非常旧或不寻常的系统,则该$(…)符号可能不起作用。在这种情况下,请尝试

/your/java/program "`/your/c/program`"

`…`是旧版本的$(…).如果$(…)适用于您的系统,请使用它。

相关内容