我正在学习 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 程序)是多个单词的情况(例如,)。这就是你所要求的。
command2
command1
"…"
command1
printf("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`"
`…`
是旧版本的$(…)
.如果$(…)
适用于您的系统,请使用它。