检查 "rm -i" 上的用户输入?

Check user input on "rm -i"?

有没有办法检查用户对 rm -i 执行的响应? 我想 echo 取决于用户是否响应 yn

命令 returns 成功,不管用户的响应如何,所以这次尝试没有成功:

$ rm -i testfile.txt && echo "The file was deleted."
remove testfile.txt? n
The file was deleted.

我的推理是 echo 部分只有在 rm 部分成功时才会执行,但显然 n 响应也算作成功执行。

我还希望能够根据答案改变消息。这段代码可以做到,但它不是很漂亮。

file=testfile.txt
touch $file

read -p "Are you sure (y/n)? " answer
if [[ $answer =~ ^[yY](es|ES)?$ ]]; then
    rm $file
    echo "Deleted file."
else
    echo "Did nothing."
fi

肯定有办法获取 rm -i 的输入。 怎么样?

您可以检查文件是否真的被删除了。例如

rm -i testfile.txt && [[ ! -e testfile.txt ]] && echo "The file was deleted."

如果rm成功,则测试,如果文件不存在[[ ! -e file ]],才显示信息。它涵盖了这种情况,当您尝试删除不存在的文件时,此后 rm 将 return 退出代码不同于 0.

如果您想在文件被故意删除或未删除时显示消息,以及有关错误的额外信息,那么您可以像这样扩展之前的代码:

rm -i testfile.txt && {
    [[ ! -e testfile.txt ]] && echo "The file was deleted." || echo "Ignored"
} || echo "Error"

你尝试的大部分问题是你试图容纳太多可能的输入,或者自相矛盾地限制输入具体"yes"或"no" 同时排除 "yeah"、"yup"、"nope" 等。只需 yn 即可(事实上,您需要做的唯一区分介于 y 和非 y).

之间
read -p "Are you sure (y/n)? " answer
if [[ $answer = [yY]* ]]; then
    rm -- "$file"
    echo "Deleted file."
else
    echo "Did nothing."
fi

如果你愿意,可以在if语句之前使用shopt -s nocasematch这样你就可以简单地写if [[ $answer = y* ]]; then来忽略用户实际输入的大小写。

您最初的问题需要 rm 本身提供的一些钩子,但它不会。