2

以下 bash 命令从名为foo(excludes .and ..) 的目录中删除所有隐藏文件:

rm -rf foo/.[^.]*

我希望将相同的命令传递给 RubyKernel::system应该做同样的事情:

system("rm -rf foo/.[^.]*")

但是,上面的 Ruby 代码会返回false并生成:

rm: cannot remove `..' directory `foo/..'

如果我这样尝试:

system("rm", "-rf", "foo/.[^.]*")

然后它返回true,但不删除任何内容。


如果我取消-f旗帜:

system("rm", "-r", "foo/.[^.]*")

然后它返回false并产生这个:

rm: cannot remove `foo/.[^.]*': No such file or directory

我想知道这个system调用是否将否定模式评估[^.]为文字字符或其他东西。我不确定问题是什么。

任何见解或建议将不胜感激。谢谢!

4

1 回答 1

3

system命令将单个字符串参数传递给/bin/sh用于处理(不是/bin/bash)。我找不到明确的引用,但它似乎[^.]是两个文字字符,^ 和 .,在sh. 试试[!.]吧。

在您的第二个和第三个示例中,“system”的参数直接传递给exec,而不是由 shell 处理,因此模式(不是正则表达式,顺便说一句)不会被扩展。第二,-f让它忽略没有文件“foo/.[^.]*”要删除的事实;第三,错误没有被抑制。

于 2012-08-20T20:16:24.360 回答