命令行参数中的 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 和引号?的主要内容,如果未能解决你的问题,请参考以下文章