3

事前定義された入力でプログラムをテストする「run」と呼ばれるbashスクリプトを書いています。

最初のパラメーターとしてファイルを取り、次に2番目のパラメーターとしてプログラムを取ります。

呼び出しは次のようになります

./run text.txt ./check

たとえば、プログラム「run」は、text.txtを入力として「check」を実行します。これにより、プログラムでのテスト時間を大幅に節約できます。

今私は持っています

$2 < text.txt > text.created

したがって、text.txtを受け取り、それを入力として指定されたプログラムにリダイレクトします。これは2番目の引数です。次に、結果をtext.createdにダンプします。

text.txtに入力があり、出力がどのようになるかはわかっていますが、text.createdをcatすると、空になります。

ファイルを入力としてプログラムを実行する適切な方法を知っている人はいますか?これは私には直感的に思えますが、「run」スクリプトで実行していることではなく、「check」プログラムに何か問題がある可能性がありますか?

ありがとう!どんな助けでも常に感謝しています!

編集:ファイルtext.txtには、プログラム'check'の入力がある複数行のファイルが含まれています。

つまり、text.txtには次のものが含まれる可能性があります

asdf1.txt asdf2.txt asdf3.txt

asdf1.txt、asdf2.txt、asdf3.txtの各ファイルでテストチェックを行いたい。

4

2 に答える 2

2

簡単なテスト

#!/bin/sh

# the whole loop reads $1 line by line
while read
do
    # run $2 with the contents of the file that is in the line just read
    xargs < $REPLY $2
done < $1

正常に動作します。そのファイルを「実行」と呼び、

./run text.txt ./check

プログラムをパラメータとして./check実行しtext.txtます。chmod +x run実行可能にすることを忘れないでください。

これは私が使用するサンプルチェックプログラムです:

#!/bin/sh

echo "This is check with parameters $1 and $2"

指定されたパラメータを出力します。

私のファイルtext.txtは:

textfile1.txt
textfile2.txt
textfile3.txt
textfile4.txt

そして、ファイルtextfile1.txt、...には、「チェック」のインスタンスごとに1行ずつ含まれています。次に例を示します。

lets go

また

one two

出力:

$ ./run text.txt ./check
This is check with parameters lets and go
This is check with parameters one and two
This is check with parameters uno and dos
This is check with parameters eins and zwei
于 2012-05-21T20:35:54.707 に答える
2

オペレーターは、ファイルの内容をプログラムの標準入力<にリダイレクトします。これは、ファイルの引数にファイルの内容を使用することと同じではありません。これは、あなたが望むもののようです。そのために

./program $(cat file.txt) 

bashで(または昔ながら/bin/shの場合は、

./program `cat file.txt`

)。

これは、複数の行を個別の呼び出しとして管理しません。これは、編集によって必要であることが示されます。そのためには、おそらく、ファイルを行ごとに簡単に解析できるようなスクリプト言語(perl、awk、python ...)を使用することになります。

于 2012-05-21T20:40:10.710 に答える