argv:消毒通配符

时间:2014-11-24 05:50:09

标签: c linux shell gcc glob

我正在研究K& R C书中的一个例子,它要求你基本上构建一个通过命令行参数获取输入的RPN计算器。我的解决方案基本上遍历给定的参数并吐出答案,但我注意到了一些事情:

如果我在没有单引号的情况下给出乘法字符(星号)'*',gcc会假定它是一个通配符输入,所以我的输入

$./rpn 5 10 *

给我输出

read 5
read 10
read rpn
read rpn.c
= 0

用单引号包装星号可以解决问题

$./rpn 5 10 '*'
read 5
read 10
read *
= 50

我的问题是有没有办法清理输入,以便我的程序不需要将星号包装在单引号中,或者这种行为是由更基本的东西引起的(例如Linux / POSIX / UNIX二进制执行和参数处理)?

2 个答案:

答案 0 :(得分:7)

shell在执行程序之前扩展了glob。你引用glob不是因为GCC,而是因为shell。如果你不想要这种行为,那就使用一个不尊重globs的shell。

答案 1 :(得分:0)

输入

$./rpn "5 10 *" 

""和程序中的所有参数,您将获得argv[1]下的所有参数,然后通过空格分隔解析该字符串。

通过这种方式,您需要以特殊方式处理任何通配符/特殊字符。