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领域,我该如何控制通配符扩展?
(通过子目录递归只是一个例子.理想情况下,我试图理解控制通配符扩展的一般解决方案.)
您的程序对shell的命令行扩展没有影响.在完成所有扩展后确定将调用哪个程序,因此以编程方式更改有关扩展的任何内容已经太晚了.
另一方面,调用程序的用户可以创建他喜欢的任何命令行.shell允许您轻松防止通配符扩展,通常将参数放在单引号中:
program -a '*.txt'
Run Code Online (Sandbox Code Playgroud)
如果您的程序被调用,它将收到两个参数-a
和*.txt
.
在Unix上,您应该将其留给用户,以便在不需要时手动阻止通配符扩展.
归档时间: |
|
查看次数: |
5255 次 |
最近记录: |