如果您运行rm -r /var/some/dir/*
并且dir为空,则会返回错误
你如何压制这个错误,以免它被退回?
我在linux bash脚本中使用它
答案 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(默认情况下)未设置nullglob
和failglob
)将逐字传递字符串/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也匹配隐藏文件。