2012-04-19 2 views
1

に失敗しbashを使用して完璧に実行し、次のコマンドを考えてみましょう:クラスはbinであるJavaは、bashの上で動作するコマンドzshの

java -classpath bin:lib/* FunctionalTests.TestRunner 

、瓶は、libmain()あるbin/FunctionalTests/TestRunnerである:

. 
├── bin 
├── lib 
│   ├── commons-collections-3.2.1.jar 
│   ├── commons-httpclient-3.1.jar 
│   ├── commons-io-2.1.jar 
│   ├── commons-lang-2.4.jar 
│   ├── commons-logging-1.1.1.jar 
│   └── ... 
└── src 

同じコマンドをzshで実行すると、出力は次のようになります。

zsh: no matches found: ./bin:./lib/* 

アイデア?

+0

現在のディレクトリのbinフォルダとlibフォルダのサブディレクトリはありますか? –

+0

はい - dir構造体を追加します。 –

+0

この投稿に基づいて、zshにはいくつかのwierdグロブの動作があるようです。http://unix.stackexchange.com/questions/5572/scp-globbing-and-different-shells –

答えて

7

それは引用符の別のペアに沸く:

java -classpath "bin:lib/*" FunctionalTests.TestRunner 

は、それが将来的に誰かに役立ちます願っています。

+3

Zshは一致しないファイルグロブをエラーとして扱い、bashはそれらをそのまま返します。だから 'echo * nosuchfile'はzshではエラーですが、bashには" * nosuchfile "という文字が表示されます。 Zshにはこの動作を変更するオプションがあります。 – yazu

+1

そして、bashには 'zsh'のようなオプションもあります:' shopt -s failglob'。 – Sorpigal

+0

この問題は、zshが環境変数を引用符の内側に展開していないことが原因です。これはうまくいきません: 'java -cp '$ M2_REPO/com/h2database/h2/1.3.159/h2 * .jar:$ M2_REPO/org/liquibase/liquibase-core/3.1.1/*。jar" liquibase .integration.commandline.Main' – jbandi

-1

はクラスパス内のすべての.jarを追加するには、このようなものを使用してみてください:

CP=bin 
for i in lib/*.jar 
do 
    CP=$CP:${i}    
done 
java -classpath $CP FunctionalTests.TestRunner 
+1

なぜ 'for i in lib/*。jar'の代わりにlsを使用していますか? http://mywiki.wooledge.org/ParsingLs – jordanm

+0

あなたが正しいです、この解決策はより良いです、私は私の投稿を修正しています。ありがとうございます – Teg

関連する問題