【问题标题】:Different rm -f behavior between bash and oh-my-zshbash 和 oh-my-zsh 之间的不同 rm -f 行为
【发布时间】:2017-08-21 13:14:55
【问题描述】:

我正在使用 oh-my-zsh。我有以下两个关于rm 命令获取来源的别名:

alias rm='rm -i'  

function clean_tex_mid_file()
{
    rm -f *.dvi *.log *.synctex.gz *.aux
}
alias cleantex='clean_tex_mid_file'

我发现当我尝试使用上面定义的cleantex 删除不存在的文件时,它会像'no matches found: *.dvi' 一样抱怨,而忽略了-f 选项。

更深入的测试表明 bash 会在尝试删除不存在的文件时保持沉默,并使用相同的别名文件。

那么如何处理这个问题以及背后发生了什么?

【问题讨论】:

  • rm -f 在这里的行为规范 - 它应该在某些东西不存在时默默地成功。
  • 请注意,zsh 中不需要使用别名来为函数提供更简单的名称;你可以给一个函数多个名字:clean_tex_mid_file cleantex () { ... }。不过,不清楚为什么需要多个名称,而不是一开始就将函数命名为 cleantex
  • @chepner 感谢您的有用建议,以前不知道这个技巧。使用两个名称的原因是我认为函数名称应该是详细的和描述性的,别名应该是简短的,尽管对于这个例子来说差别不大。

标签: linux bash alias zsh oh-my-zsh


【解决方案1】:

默认情况下,如果运行带有没有匹配项的 glob 的命令,zsh 会失败。这种行为违反了 POSIX sh 标准。

默认情况下,bash 遵循 POSIX 标准,这需要将原始 glob 表达式传递给相关应用程序。因为指定rm -f 来处理文件已经不存在的情况与成功删除该文件的情况相同,所以没有匹配项的 glob 表达式因此被视为成功情况。

要在 bash 上更改此行为,请运行:

# tell bash to abort a command rather than passing it an unexpanded glob
shopt -s failglob

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2014-01-27
    • 2011-10-11
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多