命令行参数中的 Eclipse 和引号?

Posted

技术标签:

【中文标题】命令行参数中的 Eclipse 和引号?【英文标题】:Eclipse & quotes in command line arguments? 【发布时间】:2012-11-27 22:46:59 【问题描述】:

我有一些 C++ 代码期望它的命令行看起来像这样:

/path/to/exe -p:parameterName="[/path/to/a/file,/path/to/another/file]"

包括引号。它们可以是单引号或双引号,但它们必须在那里。在 Eclipse 中,如果我设置命令行参数(调试配置/参数)并输入上面的命令行选项(减去 /path/to/exe),Eclipse 会吃掉引号。由于我在 Linux 上运行它,方括号给 shell 带来了麻烦,它甚至从未进入我的代码。

如果我这样设置命令行参数:

“这是引用”

argv[1] 看起来像这样:

这是引用

即没有引号。如果我这样设置命令行:

\"这是引用\"

我明白了:

argv[1]: "this
argv[2]: is
argv[3]: quoted"

如果我尝试将方括号放入其中,即使我试图逃避它们,也会让 shell 感到悲伤:

\"\[this is quoted\]\"

如何告诉 Eclipse 完全按照我输入的方式获取命令行参数?

谢谢

【问题讨论】:

【参考方案1】:

我解决了这个问题,所以现在提供参数有明确的规则。您可以在此处详细阅读:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=474648

主要原则是 Run 和 Debug 的行为必须相同,参数主要是程序接收的内容而不是 bash,如何提供参数的规则必须简单直观。完全避免规则是不可能的,因为当使用单个字符串来传达每个参数的结束位置时,一些特殊标记是不可避免的。

因此,参数的工作方式如下:

反斜杠后面的任何字符都按字面意思处理并失去特殊含义。

引号之后和下一个匹配的引号(或 EOF)之前的任何字符都按字面意思处理,并失去特殊含义(单引号和双引号)。

空格(除非转义或在引号内)用作参数分隔符。

以前的行为几乎没有定义,因为像 `date` 这样的东西会被 bash 替换,但行为并不总是与 bash 相同。这可能会破坏一些用户的 hacky 配置,但现在重写是微不足道的,而在必须通过各种转义引用组合的反复试验找到正确的字符串之前,“我需要一个、两个或四个反斜杠吗?”。

【讨论】:

现在需要每晚 CDT 在每个参数周围添加单引号。调试配置参数在 ARGV 中包含 A B C 我发现“A”“B”“C”。 ?【参考方案2】:

认为我找到了一个解决方案 - 至少这已经连续好几次了。在 Eclipse 的 Arguments 选项卡中,在“Program arguments”字段中输入命令行参数,如下所示:

-p:parameterName="'[foo,bar]'"

这变成:

-p:parameterName='[foo,bar]'

在 gdb 的“set args”命令中。我在方括号表达式周围加上单引号,但这对我的应用程序来说很好。我不知道为什么这样做(我希望我这样做)或者为什么其他转义文本的方式都失败了。

双引号和单引号的顺序很重要。如果您尝试将单引号放在外面,它会变成

set args -p:parameterName=\"[foo,bar]\"

失败了。不知道如果需要双引号我会怎么做。

【讨论】:

非常感谢真的有帮助。【参考方案3】:

你试过了吗

"\"\[this is quoted\]\""

?

顺便说一句:这不是 eclipse 问题,而只是反映了 shell 的行为。

【讨论】:

我没有,但我只是这样做了。一个很好的尝试,但仍然不是我想要的。我发现在“gdb traces”控制台窗口中,它显示了 Eclipse 与 gdb 的对话,在那里我可以看到它发出以下命令: (抱歉,我的编辑被打断了)我没有,但我只是这样做了。一个很好的尝试,但仍然不是我想要的。我发现在“gdb traces”控制台窗口中,它显示了 Eclipse 与 gdb 的对话,在那里我可以看到它发出 set args "\"\\[this is quoted\\]\""。我意识到 shell 解释了未转义的括号,但是 Eclipse 正在改变我告诉它用作命令行的内容。如果我在真正的命令行上输入相同的文本,它会按预期工作 - argv 中没有引号,但括号通过不受干扰。 @g-makulik:我相信这是一个 Eclipse/CDT 问题。我在 Linux GTK 和 Eclipse Indigo 上遇到了这个问题。在通过 gdb 设置参数时,eclipse/MI 未正确设置在 CDT 调试配置的参数选项卡中输入空格的程序参数周围的双引号。您必须使用单引号。另外,这里有一个线程说即使这在 Windows 上也不起作用:eclipse.org/forums/index.php/t/175270 我从 bash shell 运行程序得到了正确的行为,但不是从 eclipse 调试启动器。

以上是关于命令行参数中的 Eclipse 和引号?的主要内容,如果未能解决你的问题,请参考以下文章

如何从C#中的文件路径中删除引号和命令行参数?

传递给 Java main() 的命令行参数中的引号

eclipse中如何使用命令行参数

在 Eclipse(Pydev) 中将命令行参数传递给 Python 脚本

Python - 命令行参数中的尖括号

vs2010 怎么给c++项目预设命令行参数