【发布时间】:2013-03-04 15:17:43
【问题描述】:
这是一个我以前从未见过的问题,我认为它值得分享。我不知道为什么会这样。
这就是我调用程序的方式:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3|arg4|arg5 -switch4 -arg6
每个开关用于指示不同类型的参数,我会相应地解析它们。
问题出现在switch3上,表示arg3、arg4、arg5都对应同一个switch,用|字符划定。
由于某种原因,我可以完美地运行该程序,但是当我尝试使用 gdb 对其进行调试时,我的程序崩溃并出现 during startup, program exited with code 127 错误。
这就是我感兴趣的地方。它还写着bin/bash: arg4 not found。它在第一个 | 字符之后使用参数,现在我假设它认为它是管道字符,并尝试调用 bash 脚本。
为什么会这样???编译器是否不采用整个命令行字符串并将空格分隔的标记视为不同的参数?为什么| 的解释不同?我尝试在倒引号"" 中添加arg3|arg4|arg5,效果很好。我还尝试通过- 将它们分开,例如。 arg3-arg4-arg5,这也很好用。
【问题讨论】:
-
“编译器不接受整个命令行字符串” - 它与编译器有什么关系?当你执行程序时,它只会接收 shell 发送给它的参数, shell 完成解析它并且管道符号对 shell 具有特殊意义。它与引号一起使用,因为这告诉 shell 不要尝试解析它。
-
谢谢,我不知道 shell 负责将参数传递给可执行文件。我会查一下这个。
标签: c++ command-line pipe