argv:消毒通配符

MSa*_*lmo 8 c linux shell gcc glob

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

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

$./rpn 5 10 *
Run Code Online (Sandbox Code Playgroud)

给我一个输出

read 5
read 10
read rpn
read rpn.c
= 0
Run Code Online (Sandbox Code Playgroud)

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

$./rpn 5 10 '*'
read 5
read 10
read *
= 50
Run Code Online (Sandbox Code Playgroud)

我的问题是会有净化输入让自己的程序不需要星号在单引号包裹的方式,或者是这种行为的东西更基本的(如Linux的/ POSIX/UNIX的二进制执行和参数处理)引起的?

Ign*_*ams 7

shell在执行程序之前扩展了glob.你引用glob不是因为GCC,而是因为shell.如果您不想要此行为,请使用不支持globs的shell.