6

我有一些 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 完全按照我输入的方式获取命令行参数?

谢谢

4

3 回答 3

2

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

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

这变成:

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

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

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

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

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

于 2012-11-28T17:00:39.003 回答
2

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

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

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

因此,论点以下列方式起作用:

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

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

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

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

于 2015-12-05T06:01:43.640 回答
0

你已经试过了吗

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

?

顺便说一句:这不是日食问题,而只是反映了外壳的行为。

于 2012-11-27T22:51:32.097 回答