这是一个我以前从未见过的问题,我认为它值得分享。我不确定为什么会这样。
这是我调用程序的方式:
./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
,这也能正常工作。
最佳答案
|
字符在 bash
中有特殊含义:它创建一个 pipeline .
您的程序只能看到以下参数:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3
|arg4
语法被 bash
解释为应该运行(不存在的)arg4
命令,并且./foo
的标准输出应该通过管道传输到 arg4
的标准输入。 |arg5 ...
以相同的方式解释。
要抑制这种行为,请像这样运行您的程序:
./foo -switch1 arg1 -switch2 arg2 -switch3 'arg3|arg4|arg5' -switch4 -arg6
(注意引号)。
关于c++ - 解析命令行参数 c++ 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204839/