为什么带有完整路径的jar命令不能正常运行?

时间:2017-09-11 16:50:27

标签: bash

如果工作目录为/home/user/myApp并且运行了命令jar -cvf app.war *,则会创建具有适当结构的Web存档。但是,如果不是使用*来指定文件,而是通过运行jar -cvf app.war /home/user/myApp/*在命令中使用完整路径,则所有父目录也将包含在归档中。

换句话说,jar -cvf app.war *正确生成以下结构:

|
 - META-INF
|
 - WEB-INF

jar -cvf app.war /home/user/myApp/*产生这种结构:

|
 - home
    |
     - user
         | 
          - myApp
              |
               - WEB-INF
|
 - META-INF

这是一个错误吗?我想不出任何其他以这种方式行事的命令。这是用JDK 1.6测试的。

2 个答案:

答案 0 :(得分:1)

*是用于glob expansion的Bash(和其他shell)中的特殊字符

Bash将带有globbing的参数扩展为与glob匹配的参数列表。命令中的jar正在接收基于globs的扩展路径列表,而不是扩展globs本身。给定两组不同的参数,它的行为完全相同。

# Glob
$ ls *
bar baz foo
# Not using Globbing
$ ls foo bar baz
bar baz foo
# Glob
$ ls /Users/will/temp/*
/Users/will/temp/bar    /Users/will/temp/baz    /Users/will/temp/foo
# Not using Globbing
$ ls /Users/will/temp/foo /Users/will/temp/bar /Users/will/temp/baz
/Users/will/temp/bar    /Users/will/temp/baz    /Users/will/temp/foo

答案 1 :(得分:0)

*是一个glob表达式,在执行jar命令之前由shell 扩展。 jar命令永远不会看到*