将星号传递给命令行程序会使文件名出现在 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
当我打印 argc
和 argv[]
时,它给了我以下正确的输出
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 个选择
- 使用反斜杠 (
\*
) 或 转义每个特殊符号
- 双引号参数(如
"*"
)。
我遇到了非常奇怪的问题。我通过以下命令在 Objective-C 程序的命令行中传递多个参数。
gcc -framework Foundation main.m calculator.m -o prog1
./prog1 3 + 5 / 8
当我打印 argc
和 argv[]
时,它给了我以下正确的输出
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 个选择
- 使用反斜杠 (
\*
) 或 转义每个特殊符号
- 双引号参数(如
"*"
)。