Java命令在bash中可以运行,但在zsh中失败了。

3

考虑以下使用 bash 无缝运行的命令:

java -classpath bin:lib/* FunctionalTests.TestRunner

这些类在bin中,JAR文件在lib中,main()方法在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/*

有什么想法吗?


你的当前目录下有bin和lib文件夹吗? - undefined
是的 - 我会添加目录结构。 - undefined
根据这篇帖子,看起来zsh有一些奇怪的通配符行为。http://unix.stackexchange.com/questions/5572/scp-globbing-and-different-shells - undefined
@ColinD 我不能把“如果模式匹配失败就不执行命令”称为“奇怪”。这是“显式优于隐式”的原则:如果你不需要通配符,就要转义通配符字符。如果你需要通配符,就使用通配符字符,但要准备好处理通配符失败的错误。你可以使用*(N)来让zsh在失败时删除模式((N)设置当前模式的选项NULL_GLOB)。当然,你也可以使用选项使zsh的行为像POSIX shell一样奇怪。 - undefined
2个回答

19

简而言之,这只是另一对引号:

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

希望这能帮助到未来的某个人。


3
Zsh在处理未匹配的文件通配符时会将其视为错误,而Bash会原样返回。因此,在zsh中,执行 echo *nosuchfile 会报错,但在bash中会打印出 "*nosuchfile"。Zsh有一个选项可以改变这种行为。 - undefined
1
而且bash也有一个选项可以像zsh一样:shopt -s failglob - undefined
这个问题似乎是因为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 - undefined

-1
尝试使用类似这样的方法来添加类路径中的每个.jar文件:
CP=bin
for i in lib/*.jar
do
  CP=$CP:${i}               
done
java -classpath $CP FunctionalTests.TestRunner

1
为什么你要使用ls而不是 for i in lib/*.jar?http://mywiki.wooledge.org/ParsingLs - undefined
你是对的,这个解决方案更好,我正在修正我的帖子,非常感谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接