2012-11-27 55 views
6

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

/路径/到/ EXE -p:参数名称=“[/路径/到/一个/文件/路径/到/另一个/文件]“

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

如果我设置的命令行参数从而:

“这是引用”

的argv [1]看起来像这样:

此被引述

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

\“这是引用\”

我得到:

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

如果我尝试把方括号中它可以追溯到给予壳悲伤,即使我试图逃跑他们:

\"\[this is quoted\]\" 

我如何告诉Eclipse来把我的命令行参数完全一样,我进入了他们?

感谢

回答

0

你已经尝试

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

顺便说一句:这不是一个日食问题,但只是反映了shell的行为。

+0

我没有,但我只是。一个很好的尝试,但仍然不是我所追求的。我发现在“gdb traces”控制台窗口中,它向我展示了Eclipse与gdb的对话,并且在那里我可以看到它发出以下命令: –

+0

(对不起 - 我的编辑被中断)

我没有,但我只是做了。一个很好的尝试,但仍然不是我所追求的。我发现在“gdb traces”控制台窗口中,它向我展示了Eclipse与gdb的对话,并且在那里我可以看到它发出'set args“\”\\ [这是引用的\\] \“”'。我意识到shell会解释未转义的括号,但是它改变了我已经告诉它用作命令行的东西。如果我在真实命令行中输入相同的文本,它会按预期工作 - 在argv中没有引号,但括号会通过unmolested传递。 –

+1

@ g-makulik:我认为这是一个日食/ CDT问题。我在Linux GTK和Eclipse Indigo上遇到了这个问题。在通过gdb设置参数时,eclipse/MI没有正确设置CDT调试配置的参数选项卡中带空格的程序参数的双引号。您必须使用单引号。此外,这是一个线程,即使这不适用于Windows:http://www.eclipse.org/forums/index.php/t/175270/我得到正确的行为运行程序从bash shell,但不是eclipse调试发射器。 – timblaktu

2

认为我发现了一个解决方案 - 至少这已经连续多次工作了。在Eclipse的参数选项卡,在“程序参数”字段中输入命令行参数如下:

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

这变成:

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

在gdb的“设置ARGS”命令。我用单引号围绕方括号表达式结束,但这对我的应用程序来说很好。我不知道为什么这会起作用(我希望我这么做),或者为什么其他逃避文本的方式失败。

单引号的双重命令的重要性。如果您尝试将单引号放在外面,它会变成

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

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

+0

非常感谢*真的很有帮助。 –

2

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

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

的主要原则是运行和调试必须有同样的表现,论点主要是什么由程序而不是bash的接受,以及如何规则提供参数必须简单直观。当使用单个字符串来传达每个参数结束的位置时,完全避免规则是不可能的,某些特殊标记是不可避免的。

因此,参数以下列方式工作:

  • 下一个反斜杠任何字符字面对待,失去特殊含义。

  • 在引用之后和下一个匹配引号(或EOF)之前的任何字符都被逐字处理并失去了特殊含义(包括单和双)。

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

以前的行为是非常不确定的,就像这样`date`将由庆典被涂胶,但行为并不总是等同于猛砸。这可能会破坏一些用户的hacky配置,但现在重写是微不足道的,而在正确的字符串必须通过试验和错误与各种组合的转义引用找到之前,“我需要一个,两个还是四个反斜杠?”。

+0

现在想通了,每晚CDT在每个参数周围加单引号。调试配置参数包含 A B C 在ARGV中,我找到'A''B''C'。 ? – Gabor