【问题标题】:Why does rm -f ask me for confirmation on zsh?为什么 rm -f 要求我确认 zsh?
【发布时间】:2015-01-16 16:13:56
【问题描述】:

我正在从 Cygwin 运行 zsh。我的一个 shell 函数包含一个语句

rm -f somedir/*

(我想删除 somedir 中的所有非隐藏文件,但不是目录本身)。然而,我总是被问到:

zsh: sure you want to delete all the files in ... [yn]?

这条消息的措辞(注意开头的“zsh:”)表明问题来自 zsh,而不是 rm。但是,rm 是一个外部命令:

$ type rm
rm is /usr/bin/rm

顺便说一句,如果我显式调用 rm as 也会出现提示

$ command rm -f somedir/*

zsh里面有什么东西,太聪明了?

【问题讨论】:

  • 这个别名是否存在于您的 .zshrc 中: alias rm='rm -i' ?
  • 只需输入别名即可查看
  • 不,正如您从我的帖子中看到的那样,我同时使用了“类型”和“命令”。 'type' 会显示,如果它们是别名,'command' 会绕过它。另请注意,确认问题不是来自 rm,而是来自 zsh,我们可以从措辞中得出结论。
  • 它不会删除我的文件。等待按y
  • 请看我修改后的答案,它展示了我在 ZSH shell 中使用 sudo 的解决方案。

标签: zsh


【解决方案1】:

RM_STAR_SILENT 似乎有效。
您可以在命令行或 ~/.zshrc 中执行 setopt rmstarsilent 来告诉 zsh 不要确认 rm *

shell选项RM_STAR_SILENT是:

在执行rm *rm path/*之前不要查询用户。

-- zshoptions(1): RM_STAR_SILENT


如果您只想在该 shell 函数中临时制作 setopt 效果,您可以将其与 localoptions 结合使用,如下所示:

my-test () {
  setopt localoptions rmstarsilent
  ...
}

【讨论】:

  • 感谢您添加有关localoptions 的信息!这正是我所需要的。我喜欢这个功能,除了在我正在清除日志文件的特定功能中,我不想被提示!
  • 我仍然不清楚,如何在没有提示的情况下调用 rm 命令。顺便说一句,上面的代码是用哪种语言编写的?
  • 如何使这种改变永久化?每次我启动一个新的 shell 时都需要这样做。
  • 要在本地使用,只需在终端中运行setopt localoptions rmstarsilent。要使其永久化,请将该行添加到 ~/.zshrc 并重新加载终端。答案中的示例显示在 shell 函数中使用它。
【解决方案2】:

需要将somedir目录下所有文件和文件夹的权限递归设置为rw,然后执行:

sudo rm -rf somedir

Here's a video 我在 ZSH shell 中成功使用 sudo 执行此命令。

【讨论】:

  • 1. sudorm 确认无关 2. 如果您使用sudo 运行命令,则无需设置权限,因为超级用户无论如何都可以删除任何内容
  • @FeldsLiscia - 你尝试过你的方式和我的方式吗?如果不是这样,您可能会像我一样感到惊讶,“超级做事”并不总是与“超级存在”相同(至少在这种情况下不是)......
  • sudo 的行为与 root 不同的原因是 sudo 不在 shell 中执行命令。在zsh 中运行rm ./* 即使你是root 也会产生警告,但是使用sudo 意味着在超级用户下没有启动shell,所以在你的输入和系统之间没有zsh 来产生警告。见stackoverflow.com/a/37817783
  • 发布一段你正在谈论的视频,我也会这样做。
  • @eritbh 查看我修改后的答案,现在链接到一个视频,展示我的工作解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
相关资源
最近更新 更多