5

我在 cygwin 环境的 windows 环境中运行了一个 shell 脚本。该脚本有一个清除功能,可以根据特定条件删除系统上的特定文件夹。

我准备了要删除的所有文件夹的列表,然后使用以下命令:

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

现在,当我测试这个脚本时,目录根本没有被删除。首先我认为清除列表存在一些问题,但是在调试时我才知道清除列表很好。

经过大量调试和试验后,我只是对命令进行了一些小改动:

\rm -rfv $purge 

它只是一种命中和试验,脚本开始正常工作。现在据我所知 \rm 和 rm -f 都意味着强制删除。

现在我怎么能证明为什么'rm -f'现在更早工作但'\rm -f'做了。我想知道这两个命令之间的基本区别。

4

2 回答 2

9

可以是(理论上)以下rm之一:

  • shell 内置命令(但是我不知道任何带有这种内置命令的 shell)
  • 外部命令(很可能是 /bin/rm)
  • 外壳函数
  • 别名

如果你把它放在\它之前(或引用它的任何部分,例如"rm"或什至'r'm)shell 将忽略所有别名(但不是函数)。

正如 jlliagre 所提到的,您可以询问 shell 什么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、 functionrm和原始外部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 command和。help aliasman sh

于 2012-06-03T17:58:55.173 回答
5

这意味着您的 rm 命令是别名或函数。反斜杠告诉 shell 使用真正的 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 回答