在命令行语法上不返回任何错误

时间:2013-11-11 15:16:21

标签: linux bash shell

如果您运行rm -r /var/some/dir/*并且dir为空,则会返回错误

你如何压制这个错误,以免它被退回?

我在linux bash脚本中使用它

3 个答案:

答案 0 :(得分:4)

除了重定向到stderr之外,您还可以使用-f

rm -rf /var/some/dir/*

来自man rm

-f, --force
            ignore nonexistent files and arguments, never prompt

答案 1 :(得分:2)

重定向stderr:

rm -r /var/some/dir/* 2>/dev/null

答案 2 :(得分:2)

因为你提问 [if] dir是空的,会返回错误(所以假设目录存在),那是因为glob /var/some/dir/*没有匹配,因此bash(默认情况下)未设置nullglobfailglob)将逐字传递字符串/var/some/dir/*。并且没有这样的文件,所以rm抱怨。

由于您在bash脚本中使用它,我建议您按以下步骤操作:

shopt -s nullglob
shopt -u failglob
declare -a files=( /var/some/dir/* )
if (( ${#files[@]} )); then
    rm -r -- "${files[@]}" # || error handling
fi
  • 如果不存在匹配的文件,shopt -s nullglob将使globs扩展为空,
  • 您将匹配的文件放在数组files中(因为设置了nullglob,如果没有匹配项,则数组files为空),
  • 如果有匹配的文件,则为rm

这样做将使您的脚本更加健壮,因为您将能够捕获rm|| error handling部分)中发生的真正错误,并且不会将此错误与一个不匹配的glob。

这样做,您将不会使用不受控制的参数启动随机命令。

备注。仅当目录为空时才会出现错误。当目录不包含任何文件时,它会发生,但可能是隐藏文件。如果你想从潜在的隐藏文件中真正清除目录,你必须shopt -s dotglob以便glob也匹配隐藏文件。