私はUnixファイルシステムについて学んでいます管路。 ~によるとオタク中のオタク、
パイプは、2番目のプログラムが読み取られるまで、最初のコマンドの出力を保持します。
だからできるかと思いました。協会ㅏCプログラムそしてJavaプログラムCコードの出力をJavaコードのコマンドライン引数として提供します。
これは私のコードです。
CC
#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`"
`…`
以前のバージョンです$(…)
。$(…)
システムに該当する場合はそれを使用してください。