如何在运行可执行文件时提取“*”而不提供引号

时间:2014-09-04 11:32:59

标签: c bash shell

[root@aman dir2]# ls
d1  d2  d3  d4  d5  f1  f2  f3  f4  f5
[root@aman dir2]# rm -f *
rm: cannot remove `d1': Is a directory
rm: cannot remove `d2': Is a directory
rm: cannot remove `d3': Is a directory
rm: cannot remove `d4': Is a directory
rm: cannot remove `d5': Is a directory
[root@aman dir2]# ls
d1  d2  d3  d4  d5
[root@aman dir2]# rm -rf *
[root@aman dir2]# ls
[root@aman dir2]#

我正在编写一个删除文件和目录的工具。我需要验证用户是否已将参数设为"*",然后删除所有文件和文件夹。但是"*"作为参数给出了目录中存在的文件和文件夹的数量,如何验证"*"而不给出双引号。

./a.out *./a.out -f *./a.out -rf *。我无法给出./a.out "*"。我需要输入./a.out *并进行验证。怎么做?

1 个答案:

答案 0 :(得分:0)

你绝对不能这样做。原因是它是你的shell,而不是你运行过程的任何部分,它会扩展像*这样的通配符。但是你有一些选择:

  1. 使您的程序使用引号形式的通配符,例如'*',并使用globfnmatch等在内部展开它。您可以检测通配符是否已被扩展通过注意多个输入参数到达,或者如果单个输入参数,它是一个现有文件名(*不太可能存在于真实文件名中)。这样做的好处是,您永远不会无法处理非常大的扩展; shell本身不能在命令行上传递超过一定数量的字符,这有时是通配符的限制。
  2. 让您的程序一次拒绝对超过N个文件进行操作。在某些情况下,这可能是一个有用的保护措施。
  3. 在系统上修补shell以将当前未展开的命令行存储在环境变量中,并从程序中读取它。这只是为了大胆!
相关问题