将星号传递给命令行程序会使文件名出现在 argv 中

Passing an asterisk to a command-line program makes filenames appear in argv

我遇到了非常奇怪的问题。我通过以下命令在 Objective-C 程序的命令行中传递多个参数。

gcc -framework Foundation main.m calculator.m -o prog1

./prog1 3 + 5 / 8

当我打印 argcargv[] 时,它给了我以下正确的输出

argc = 6

argv[] = prog1,3,+,5,/,8

当我在输入中插入一个“*”时出现问题:./prog1 3 + 5 / 8 * 8然后它给了我非常奇怪的输出

argc = 12
argv [] = 3,+,5,/,8,calculator.h,calculator.m,main.m,prog1,8

怎么了?

您 运行 来自的 shell 正在将星号解释为 file glob;在将参数传递给您的程序之前,它会用当前目录中所有文件的名称替换该字符。

您需要转义星号 \* 才能按字面意思传递。这也适用于您的 shell 解释的其他字符,例如引号 "'、反斜杠和符号。

您有 2 个选择

  • 使用反斜杠 (\*) 或
  • 转义每个特殊符号
  • 双引号参数(如 "*")。