解析命令行参数c ++时奇怪的行为

Sre*_*and 2 c++ command-line pipe

这是我以前从未见过的一个问题,并认为这将是值得分享的.我不知道为什么会这样.

这是我调用我的程序的方式:

./foo -switch1 arg1 -switch2 arg2 -switch3 arg3 | arg4 | arg5 -switch4 -arg6

每个开关用于指示不同类型的参数,我会相应地解析它们.

与交换机3,它表示发生该问题arg3,arg4,arg5所有对应于相同的开关,并使用被描绘|字符.

出于某种原因,我可以完美地运行程序,但是当我尝试使用gdb进行调试时,我的程序崩溃并出现during startup, program exited with code 127错误.

这就是让我感兴趣的东西.它还说bin/bash: arg4 not found.它接受第一个|字符后面的参数,现在我假设它将其视为管道字符,并尝试调用bash脚本.

为什么会这样?编译器是否采用整个命令行字符串并将空格分隔的标记视为不同的参数?为什么|被解释不同?我尝试添加arg3|arg4|arg5倒置引号"",它工作正常.我也尝试过将它们分开-,例如.arg3-arg4-arg5,这也很好.

NPE*_*NPE 7

|角色具有特殊含义bash:它创建一个管道.

您的程序只能看到以下参数:

./foo -switch1 arg1 -switch2 arg2 -switch3 arg3
Run Code Online (Sandbox Code Playgroud)

|arg4语法被解释bash为是指该(不存在)arg4命令应该运行,而标准输出./foo应管道输送到的标准输入arg4.该|arg5 ...被解释的相同方式.

要抑制此行为,请运行您的程序,如下所示:

./foo -switch1 arg1 -switch2 arg2 -switch3 'arg3|arg4|arg5' -switch4 -arg6
Run Code Online (Sandbox Code Playgroud)

(注意引号).