【问题标题】:escape an asterisk as a Java command line argument in shell在 shell 中将星号转义为 Java 命令行参数
【发布时间】:2014-06-25 17:23:45
【问题描述】:

在 shell 中使用星号作为 Java 命令行参数时遇到问题。 我可以将这个问题的描述简化如下:

首先,有一个简单的 java 程序可以打印命令行参数。

public class CmdArgsTest 
{
    public static void main(String[] args) 
    {
        for(String arg : args)
        {
        System.out.println(arg);    
        }
    }
}

当我在shell命令中输入:Java CmdArgsTest "s*";

它不会打印“s*”,而是当前目录下的所有文件名。

我已经在论坛中搜索过类似的问题,并尝试使用单引号's*'或反斜杠's/*',但都不起作用。

希望有人可以帮助我。感谢您的帮助。

顺便说一句:感谢 Elliott Frisch 的提醒,我在 Cygwin 上试过这个例子,我不知道它是否重要

【问题讨论】:

  • 尝试“S\\*”。它应该可以工作。
  • 不是所有文件,只有以s开头的文件。
  • $ java CmdArgsTest 's\*',它也不起作用。正则表达式:“s\*”
  • 是的,不是所有文件,只有以 s 或 S 开头的文件

标签: java bash shell


【解决方案1】:

您似乎在与 shell globbing 战斗,而您的命令必须是 java CmdArgsTest s* 才能获得该行为

$ echo \*
*
$ echo "*"
*
$ echo '*'
*

所以,

java CmdArgsTest "s*"

java CmdArgsTest s\*

java CmdArgsTest 's*'

编辑(Cygwin)

使用 windows shell 转义语法,

"java CmdArgsTest s*"

您需要在 cygwin 中以这种方式执行命令,因为 cygwin 能够运行 Windows 命令 - 如 wiki 中所述,

Cygwin 提供基于 Windows 的应用程序、数据和其他系统资源与类 Unix 环境的应用程序、软件工具和数据的本地集成。因此,可以从 Cygwin 环境启动 Windows 应用程序,也可以在 Windows 操作环境中使用 Cygwin 工具和应用程序。

【讨论】:

  • 相信我,我已经准确地使用了 java CmdArgsTest "s*"。我知道您的三个回声示例是正确的。似乎 java 程序无法将简单的 s* 作为其参数。
  • @Jimmy 使用 System.out.println(Arrays.toString(args));,这就是 bash(以及我能想到的每个 unix shell,甚至是 fish)的工作原理。
  • 运气不好;我试过了,它也没有工作。如果当前目录下有 s1.txt 和 s2.txt。显示为:[s1.txt,S2.txt]
  • @jimmy Unix 文件通常区分大小写。这又是什么平台?
  • 我的声誉不允许我发布截图,否则我可能会显示结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多