这是我从未见过的问题,并且认为它值得分享。我不确定为什么会这样。

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



每个开关用于指示不同类型的参数,因此我将对其进行解析。

switch3出现问题,这表明arg3arg4arg5都对应于同一开关,并使用|字符进行了描述。

由于某种原因,我可以完美地运行该程序,但是当我尝试使用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
|arg4bash语法解释为意味着应运行(不存在)arg4命令,并且应将./foo的标准输出传递到arg4的标准输入中。 |arg5 ...的解释方式相同。

要抑制这种行为,请按以下方式运行程序:
./foo -switch1 arg1 -switch2 arg2 -switch3 'arg3|arg4|arg5' -switch4 -arg6

(请注意引号)。

10-07 16:43