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

时间:2016-03-26 02:45:58

标签: macos shell command-line 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

出了什么问题?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您有2个选项

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