5

cygwin 環境の Windows 環境で 1 つのシェル スクリプトを実行しています。このスクリプトには、特定の条件に基づいてシステム上の特定のフォルダーを削除するパージ機能が 1 つあります。

削除するすべてのフォルダーのリストを準備してから、次のコマンドを使用します。

rm -rfv $purge (where purge is the list of directories I want to delete)

このスクリプトをテストしたところ、ディレクトリはまったく削除されませんでした。最初はパージリストによる問題があると思っていましたが、デバッグ中にパージリストが問題ないことがわかりました。

多くのデバッグと試行の後、コマンドに小さな変更を加えました:

\rm -rfv $purge 

それは一種のヒットと試行であり、スクリプトは正常に機能し始めます。私が知る限り、 \rm と rm -f はどちらも強制削除を意味します。

なぜ「rm -f」が以前に機能していたが、「\ rm -f」が機能したのか、これをどのように正当化できますか。これら 2 つのコマンドの基本的な違いを知りたいです。

4

2 に答える 2

9

rm(理論的には) 次のいずれかになります。

  • シェル組み込みコマンド(ただし、そのような組み込みのシェルは知りません)
  • 外部コマンド (おそらく /bin/rm)
  • シェル関数
  • エイリアス

その前に置いた場合\(またはその一部を引用した場合、たとえば"rm"、または でさえも'r'm)、シェルはすべてのエイリアスを無視します (ただし、関数は無視します)。

jlliagreが述べたように、シェルrmに何が組み込み\rmを使用しているのかを尋ねることができます。type

実験:

$ type rm
rm is /bin/rm
$ rm() { echo "FUNC"; command rm "$@"; }
$ type rm
rm is a function
$ alias rm='echo ALIAS; rm -i'
$ type rm
rm is aliased to `echo ALIAS; rm -i'

これで、 alias rm、 function rm、元の外部rmコマンドができました: お互いを呼び出す方法を見てみましょう:

$ rm   # this will call alias, calling function calling real rm
$ rm
ALIAS
FUNC
rm: missing operand
$ \rm  # this will ignore alias, and call function calling real rm
FUNC
rm: missing operand
$ command rm  # this will ignore any builtin, alias or function and call rm according to PATH
rm: missing operand

深く理解するには、 、 、および を参照help builtinhelp commandhelp aliasくださいman sh

于 2012-06-03T17:58:55.173 に答える
5

これは、rmコマンドがエイリアスまたは関数であることを意味します。バックスラッシュは、実際のrmコマンドを使用するようにシェルに指示します。

編集:コマンドで何rmを参照しているかがわかりますtype。例:

$ type rm
rm is /bin/rm

$ type rm
rm is aliased to `rm -i'

$ type rm
rm is a function
...
于 2012-06-03T13:23:28.030 に答える