bash 和 oh-my-zsh 之间的不同 rm -f 行为
Different rm -f behavior between bash and oh-my-zsh
我正在使用 oh-my-zsh。我有以下两个关于 rm
command get sourced 的别名:
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 将保持沉默尝试删除不存在的文件,寻找相同的别名文件。
那么如何处理这个问题以及背后发生了什么?
zsh,默认情况下,如果 运行ning 一个带有没有匹配项的 glob 的命令会失败。此行为违反了 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
我正在使用 oh-my-zsh。我有以下两个关于 rm
command get sourced 的别名:
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 将保持沉默尝试删除不存在的文件,寻找相同的别名文件。
那么如何处理这个问题以及背后发生了什么?
zsh,默认情况下,如果 运行ning 一个带有没有匹配项的 glob 的命令会失败。此行为违反了 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