1

私は Java5 を使用しており、クラスパスで各 .jar ファイルをポイントしたくないので、小さなシェル スクリプトを記述しようとしました。

find $LIB_DIR -name '*.jar' -print > /tmp/classpath
CP= 
cat /tmp/classpath | while read line
do 
CP=$CP:$line
done 
rm -f /tmp/classpath

しかし、これは機能しません - $CP 変数が空です。

結果として、$CP はパスが「:」で区切られた単一の文字列である必要があります。

ここで何が間違っているのか、すべてのファイルの行を1つの文字列に正しく連結する方法を知っている人はいますか?

4

3 に答える 3

5

while ループはサブシェルにあるため、変数はメイン シェルに戻されません。とにかくこのようなことをしたい:

CP=$(find $LIB_DIR -name '*.jar' -print | tr '\n' ':')

それはあなたが望むすべてを1行で行います。

于 2011-05-05T12:59:41.903 に答える
1

問題は、while ループが別のシェル インスタンスで実行され、その中のローカル変数 ( $CP) が外側のシェルで使用できないことです。

何かのようなもの

while read line; do
    CP="$CP:$line"
done < /tmp/classpath

動作するはずです。ただし$CP、最初の文字がコロンになるため、後処理が必要になることに注意してください。

さらに、 を使用する必要があります。mktempそうしないと、誰かが/tmp/classpath.

于 2011-05-05T13:09:59.800 に答える
0

Uwe Kleine-König と Steve Baker の while-do-done ブロックは本質的にサブシェルではなく、このコード ブロックでのパイプの使用のためであることを明確にするため

cat /tmp/classpath | while read line
do 
CP=$CP:$line
done 

Bash の man ページから: 「パイプライン内の各コマンドは、個別のプロセスとして (つまり、サブシェル内で) 実行されます。」

サブシェルの詳細。

パイプとサブシェルに関する別の SO 回答も参照してください。

ここにリンクの説明を入力

于 2011-05-06T08:55:41.247 に答える