2

这是一个我以前从未见过的问题,我认为它值得分享。我不确定它为什么会发生。

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

./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,这也很好用。

4

2 回答 2

7

这个|字符有一个特殊的含义bash:它创建了一个管道

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

./foo -switch1 arg1 -switch2 arg2 -switch3 arg3

|arg4语法被解释bash为意味着arg4应该运行(不存在的)命令,并且应该将 的标准输出./foo通过管道传输到arg4. 以相同的|arg5 ...方式解释。

要抑制这种行为,请像这样运行您的程序:

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

(注意引号)。

于 2013-03-04T15:19:37.730 回答
4

问题是这|是一个管道,所以你最终试图调用 shell 找不到的 arg4。您需要在其中使用管道引用内容,即"arg3|arg4|arg5"

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

如果您好奇,可以查看bash 陷阱。如果您没有进行大量的 shell 编程,您可能不会经常看到这些问题,但是当您这样做时,您可能需要一段时间才能弄清楚发生了什么,因此从长远来看,了解更多关于 shell 编程的知识可能会有所帮助。我记得打了第 3 号,我花了一段时间才第一次找到一个好的解决方案。

于 2013-03-04T15:20:11.817 回答