2

次の bash コマンドは、 (とfooを除く) という名前のディレクトリからすべての隠しファイルを削除します。...

rm -rf foo/.[^.]*

この同じコマンドを Ruby に渡すとKernel::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単一の文字列引数を に渡します( ではありません)。決定的な引用を見つけることはできませんが、. の ^ と . の 2 つのリテラル文字のようです。代わりに試してください。/bin/sh/bin/bash[^.]sh[!.]

2 番目と 3 番目の例では、「system」への引数は直接 に渡され、シェルによって処理されないexecため、パターン (ちなみに正規表現ではありません) は展開されません。2 番目の例では、削除するファイル "foo/.[^.]*" がないという事実を無視します。3 番目では、エラーは抑制されません。-f

于 2012-08-20T20:16:24.360 に答える