在C或C++中控制shell命令行通配符扩展

Adr*_*thy 1 c++ unix shell command-line wildcard

我正在用C++编写一个程序foo.它通常在命令行上调用,如下所示:

foo *.txt
Run Code Online (Sandbox Code Playgroud)

main()以正常方式接收参数.在许多系统上,argv[1]字面意思是*.txt,我必须调用系统例程来进行通配符扩展.但是,在Unix系统上,shell会在调用我的程序之前扩展通配符,并且所有匹配的文件名都将在其中argv.

假设我想添加一个开关到foo,导致它递归到子目录.

foo -a *.txt
Run Code Online (Sandbox Code Playgroud)

将处理当前目录及其所有子目录中的所有文本文件.

我没有看到这是如何完成的,因为当我的程序有机会看到它时-a,shell已经完成了扩展并且用户的*.txt输入丢失了.然而,有一些常见的Unix程序以这种方式工作.他们是如何做到的呢?

在Unix领域,我该如何控制通配符扩展?

(通过子目录递归只是一个例子.理想情况下,我试图理解控制通配符扩展的一般解决方案.)

sth*_*sth 6

您的程序对shell的命令行扩展没有影响.在完成所有扩展后确定将调用哪个程序,因此以编程方式更改有关扩展的任何内容已经太晚了.

另一方面,调用程序的用户可以创建他喜欢的任何命令行.shell允许您轻松防止通配符扩展,通常将参数放在单引号中:

program -a '*.txt'
Run Code Online (Sandbox Code Playgroud)

如果您的程序被调用,它将收到两个参数-a*.txt.

在Unix上,您应该将其留给用户,以便在不需要时手动阻止通配符扩展.