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

标签 c++ command-line pipe

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

这是我调用程序的方式:

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

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

switch3出现问题,表示arg3arg4arg5都对应同一个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/

相关文章:

c++ - 如何在执行 SFINAE 时反省 boost::hana::map<...>,而没有它的 (constexpr) 实例?

c++ - 父级的静态变量是否保证在子级的静态变量之前初始化?

shell - 乘以2个数组索引变量shell编程

c++ - 模仿unix shell管道

pipe - 如何将 7z 输出通过管道传输到 7z

c++ - 为什么在链接列表中链接之前需要填充数据?

c++ - 有没有办法确定是否发生异常?

python - 为什么我的 post-receive Hook 在从子进程管道读取时挂起?

command-line - 解析 Windows 命令行输出以获取 PID

linux - Linux 上的 ZSH 无法识别 shell 脚本中的有效选项