如何将bash中的星号字符'*'作为我的C程序的参数传递?

Yz *_*ong 27 bash escaping

假设我有一个C程序,我从bash运行它:

$ ./a.out 123 *
Run Code Online (Sandbox Code Playgroud)

该程序将输出所有命令行参数,但它将显示以下内容:

Argument 1: 123
Argument 2: a.out

我可以在我的程序中做些什么来解决这个问题?

Jam*_*lis 32

shell正在用目录中每个文件的名称替换星号.

要传递文字星号,您应该能够将其转义:

$ ./a.out 123 \*
Run Code Online (Sandbox Code Playgroud)

  • 我是一个重击专家; 我的回答是"不!" :-) + 1反斜杠解决方案 - 这是首选的IMNSHO,因为引号将阻止变量扩展.反斜杠单个字符不会产生副作用. (7认同)
  • 你可以运行`bash -f`来完全禁用globbing/filename扩展,虽然我不确定这是OP想要的. (2认同)
  • 詹姆斯是对的.你不能在C中做任何事情,因为shell会在调用你的程序之前替换`*`*.C程序无法确定是否将通配符传递给shell或(在本例中)是手动键入的文件列表.为了得到纯粹的`*`到你的C程序,你必须使用`\\*`来逃避它(也就是说,告诉shell不要像通常那样扩展它). (2认同)

fra*_*nkc 22

另一种选择是用来set -f关闭扩展.相比:

echo *
Run Code Online (Sandbox Code Playgroud)

VS

set -f
echo *
Run Code Online (Sandbox Code Playgroud)

您可以将其重新打开set +f:

set -f
echo *
set +f
echo *
Run Code Online (Sandbox Code Playgroud)


Mat*_*hen 18

你可以在shell中引用它

./a.out 123 '*'
Run Code Online (Sandbox Code Playgroud)

你的程序中没有什么可以做的,因为*扩展是由shell完成的(与Windows相比,它由程序完成).

  • 究竟.shell在调用可执行文件之前扩展元字符,因此您的程序不知道用户键入了星号.这是很好的标准Unix行为,你不想"修复"它.如果你不希望shell扩展元字符,你可以使用\来转义它们,或者将args放在单引号内. (4认同)

Mah*_*ahn 6

另一种选择是将脚本#!/bin/bash -f作为第一行开始,这将允许您接受文字字符串作为参数(包括星号),从而允许您./a.out 123 *使用所需的输入运行,但请注意bash -f完全禁用扩展,并且这可能会对您的脚本产生不利影响,具体取决于您的操作。


Jör*_*tag 5

这与您的程序没有任何关系。

*是Bash的一个通配符,它的意思是“在当前目录下的所有文件”。如果您想将星号作为参数传递给您的程序,您可以按照与其他所有程序相同的方式进行操作:用反斜杠将其转义或引用它。