2

私は現在、./ のすべてのフォルダーに入り、blah.java をコンパイルする bash スクリプトを作成しようとしています。次に、入力用の番号を送信する blah を実行し、名前を付けたファイルに出力を入れます。ある程度機能するものがありますが、最初のディレクトリにしか入れられず、その後失敗します。私は現在持っています...

#! /bin/bash


for i in $(find . -maxdepth 1 -type d)
do

    pwd
    cd $i
    pwd

    if [ -f "blah.java" ];
    then
        javac -cp . blah.java
        echo "17" | java -cp . blah - > blahresult17
        echo "43" | java -cp . blah - > blahresult43

    fi

done

サブディレクトリに入ると ./ からディレクトリに移動しようとしているため、問題があると思いますが、明らかにサブディレクトリからは存在しません。

4

3 に答える 3

1

あなたcdはディレクトリに入りますがcd、そこから出ることはありません。

私の提案:の代わりにpushd/popdcdを使用してください。

に置き換えcd $iて、ループの最後にpushd "$i"置きます。popd

またfor dir in */、現在のディレクトリ内のすべてのディレクトリを反復するためのより簡単なソリューションになります。

于 2012-10-16T14:22:47.400 に答える
1

if に fi がありませんが、それはおそらくカット アンド ペースト エラーであり、失敗の原因ではありません。考えられる問題は、最初の cd を実行すると、次の cd コマンドが、現在の場所ではなく、以前の場所に相対的になることです。代わりに pushd/popd を使用するか、サブシェルで cd および java ビットを実行して、cd が次のループ反復まで持続しないようにすることで、これを回避できます。

于 2012-10-16T14:24:40.027 に答える
0

これは、javac を 1 回呼び出してすべてのファイルをコンパイルする場合の別の方法です。これにより、javac は依存関係を処理できます。

SRC=`find src -name "*.java"`
if [ ! -z $SRC ]; then
    javac -classpath $CLASSPATH -d obj $SRC
    # stop if compilation fails
    if [ $? != 0 ]; then exit; fi
fi
于 2014-04-25T18:27:40.113 に答える