3

说,我想在 shell 中删除一个tmp/目录。

在 linux(如 ubuntu)中,我可以rm tmp/ -frrm -fr tmp/. 但在 mac 中,我只能rm -fr tmp/.

有没有办法配置mac shell(bash/zsh/...),所以我可以使用类似linux的命令样式:rm tmp/ -fr

4

3 回答 3

4

在操作数之后有选项rm tmp/ -fr是非标准的。IEEE Std 1003.1-2001 在第12.2 节实用程序语法指南中有:

准则 9:所有选项都应在命令行上的操作数之前。

GNU 实用程序(大多数 Linux 发行版使用)的实现者选择添加许多非标准扩展。虽然有时很方便,但使用这些扩展本质上是不可移植的。MacOS X 有一个从 BSD 派生的用户空间,它没有大多数非标准 GNU 扩展。如果您希望将来使用非 GNU 系统,例如 BSD、Solaris 或任何其他商业 UNIX,那么坚持实用程序的标准语法而不习惯任何 GNU 扩展确实是值得的。在使用所有不同的 UNIX 操作系统时,它节省了很多麻烦。这在编写脚本时尤其重要。在脚本中依赖 GNU 语法会使它们无法移植。

因此,与其在 MacOS X 上安装 GNU coreutils,我的建议是使用它作为习惯标准语法(IEEE Std 1003.1、POSIX.2 等)的机会。

于 2012-05-04T08:11:55.303 回答
3

这取决于您使用的命令。OS X 来自 BSD 家族(通过 NeXTSTEP),因此它们的标准实用程序大多来自 BSD。BSD 和 Linux 风格的命令之间有很大程度的兼容性,但每隔一段时间你就会遇到这样的特定于实现的事情。如果你真的想使用 Linux 版本的命令,你可以安装 GNU coreutils 包。它可从Homebrew(推荐)和MacPorts获得。不过,总的来说,由于命名冲突等原因,在内置的 BSD 工具链上安装 GNU coreutils 是一件痛苦的事情。

于 2012-05-04T07:07:37.860 回答
0

它通常取决于您执行的命令的实现。但是,至于rm(假设您的意思是rm),因为您将其用作示例,所以您不能。至少它不会像你想的那样做。

  • rm -fr tmp/: 将删除tmp/带有选项-r和的目录-f,因此是递归的(这里是强制性的)和强制的。
  • rm tmp/ -fr: 将(尝试)删除目录tmp/和/或名为 的文件/目录-fr,但会产生错误:rm: tmp/ directory

注意:删除名为的文件的唯一其他方法-rf是使用rm -- -rf.

于 2012-05-04T05:48:22.940 回答