1

私は 2 つのプログラム (Prog1.cProg2.c) を書き込んでCおり、それぞれが 1 つのコマンド ライン引数を取ります。

Prog1.cファイル名を引数として取り、ファイルからコンテンツを読み取り、STDOUT(標準出力) 画面に出力します。Prog2.cデータを引数として取り、何らかの操作を行います。Prog1.cの出力を入力としてリダイレクトしたいProg2.c

次のbashスクリプトを試してみましたが、エラーが発生しました

#!/bin/bash
prog2 "`prog1 file.txt`"  

私も引用符なしで試しましたが、どちらの場合も次のエラーが発生します。

Prog2:: argument list too long.
4

3 に答える 3

3

コマンドの出力を別のコマンドのパラメーターとして取得するには、バッククォートを使用できます。

prog2 "`prog1 file.txt`"

または使用します$()(これはbashのより好ましい方法だと思います):

prog2 "$(prog1 file.txt)"

prog1 の STDOUT を prog2 の STDIN として使用する場合は、 | を使用します。(パイプ) 演算子:

prog1 | prog2

argv注: パイプを使用する場合は、関数のコマンド引数ではなく STDIN から読み取る必要があるため、prog2 のコードを変更する必要がありますmain()C でコンソールから行を読み取る方法を参照してください。これを行う方法の例。

于 2012-12-03T09:33:52.860 に答える
2

パイプ!!!!!

コマンドライン (またはスクリプト内) でprog1 file.txt | prog2

于 2012-12-03T09:32:29.857 に答える
1

prog1 の前後の両方でバッククォートを使用する必要があります

prog2 "`prog1 file.txt`"

「引数リストが長すぎます」というメッセージが表示された場合は、コマンド ラインのシステム制限に達しています。次に、データを に送信する別の方法を見つける必要がありますprog2。代わりに読み取りstdin、prog1 の出力を prog2 にパイプすることができます。

prog1 file.txt | prog2

prog1 から prog2 にデータをパイプする場合、argv を使用する代わりに、prog2 を変更して stdin から読み取る必要があります。

行ごとに読む例:

char buf[1024];
while (fgets(buf, 1024, stdin)) {
    /* process line in buf */
}

空白で区切られた単語の読み方の例

char buf[1024];
while (scanf("%s", buf) != EOF) {
    /* process word in buf */
}
于 2012-12-03T09:31:30.957 に答える