0

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

你怎么能抑制这个错误所以它不返回?

我在 linux bash 脚本中使用它

4

3 回答 3

4

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

rm -rf /var/some/dir/*

来自man rm

-f, --force
            ignore nonexistent files and arguments, never prompt
于 2013-11-11T15:19:32.827 回答
2

重定向标准错误:

rm -r /var/some/dir/* 2>/dev/null
于 2013-11-11T15:18:27.837 回答
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将使 glob 扩展为空,
  • 您将匹配的文件放在一个数组中files(并且因为nullglob已设置,files如果没有匹配项,则该数组为空),
  • 如果有匹配的文件,那么rm它们。

像这样继续操作将使您的脚本更加健壮,因为您将能够捕获rm(与该|| error handling部分)发生的真正错误,而不会将其与不匹配的 glob 发生的错误混淆。

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

评论。您获得的错误仅在目录为空时才会发生,这并不完全正确。当目录不包含任何文件(可能是隐藏文件除外)时,就会发生这种情况。如果您想真正从潜在的隐藏文件中清除目录,则必须shopt -s dotglob使 glob 也匹配隐藏文件。

于 2013-11-11T15:30:43.533 回答