[英]Strange behviour while parsing command line arguments c++
这是我以前从未见过的一个问题,并认为这将是值得分享的。 我不知道为什么会这样。
这是我调用我的程序的方式:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3 | arg4 | arg5 -switch4 -arg6
每个开关用于指示不同类型的参数,我会相应地解析它们。
switch3出现问题,表示arg3
, arg4
, arg5
都对应同一个交换机,并使用|
字符。
出于某种原因,我可以完美地运行程序,但是当我尝试使用gdb调试它时,我的程序during startup, program exited with code 127
崩溃during startup, program exited with code 127
错误。
这就是让我感兴趣的东西。 它还说bin/bash: arg4 not found
。 它在第一个|
之后就接受了论证 字符,现在我假设它将其视为管道字符,并尝试调用bash脚本。
为什么会这样? 编译器是否采用整个命令行字符串并将空格分隔的标记视为不同的参数? 为什么|
被解释不同? 我尝试在反向引号""
添加arg3|arg4|arg5
,它工作正常。 我也尝试将它们分开-
例如。 arg3-arg4-arg5
,这也很好用。
|
character在bash
有特殊含义:它创建一个管道 。
您的程序只能看到以下参数:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3
bash
解释|arg4
语法意味着应该运行(不存在的) arg4
命令,并且./foo
的标准输出应该通过管道输入到arg4
的标准输入中。 |arg5 ...
以相同的方式解释。
要抑制此行为,请运行您的程序,如下所示:
./foo -switch1 arg1 -switch2 arg2 -switch3 'arg3|arg4|arg5' -switch4 -arg6
(注意引号)。
问题是|
是一个管道,所以你最终试图调用shell无法找到的arg4。 你需要用它们中的管道引用内容,即"arg3|arg4|arg5"
:
./foo -switch1 arg1 -switch2 arg2 -switch3 "arg3|arg4|arg5" -switch4 -arg6
如果你很好奇,你可以查看bash陷阱 。 如果你没有进行大量的shell编程,你可能不会经常看到这些问题,但是当你这样做时可能需要一段时间来弄清楚发生了什么,所以从长远来看,学习shell编程的更多信息会有所帮助。 我记得打过3号,我第一次找到一个好的解决方案花了一些时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.