如果我有一个包含以下脚本代码的基本 .sh 文件:
#!/bin/sh
rm -rf "MyFolder"
如何使此运行脚本文件向终端显示结果,以指示目录删除是否成功?
你真的不需要让它说它是成功的。你可以让它只在错误 ✖ 上说些什么,然后沉默意味着成功 ✔。
这就是 Unix 哲学的运作方式:
沉默规则,也称为沉默是黄金法则,是Unix 哲学的重要组成部分,它指出当程序没有什么令人惊讶、有趣或有用的内容时,它应该什么也不说。这意味着表现良好的程序应该将用户的注意力和注意力视为有价值的,从而尽可能不引人注目地执行他们的任务。也就是说,沉默本身就是一种美德。http://www.linfo.org/rule_of_silence.html
这就是rm
它本身的行为方式。
如果您询问一般情况,如您的问题标题所建议的那样,您可以运行您的脚本sh -x scriptname
以查看它在做什么。将诊断输出写入脚本本身并使用选项控制它也很常见。
#!/bin/sh
verbose=false
case $1 in -v | --verbose )
verbose=true
shift ;;
esac
say () {
$verbose || return
echo "$0: $@" >&2
}
say "Removing $dir ..."
rm -rf "$dir" || say "Failed."
如果您在没有任何选项的情况下运行此脚本,它将静默运行,就像表现良好的 Unix 实用程序一样。如果您使用该-v
选项运行它,它将打印一些诊断到标准错误。
rm -rf "My Folder" && echo "Done" || echo "Error!"
您可以在 bash 手册中阅读有关创建管道序列的更多信息
在 bash(和其他类似的 shell)中,?
环境变量为您提供最后执行的命令的退出代码。所以你可以这样做:
#!/bin/sh
rm -rf "My Folder"
echo $?
更新
如果rm
命令执行后目录不存在(因为它已被成功删除或因为执行命令时它不存在)脚本将打印 0。如果目录存在(这意味着命令无法删除它)然后脚本将打印除 0 以外的退出代码。如果我理解正确的问题,这正是所要求的行为。如果不是,请纠正我。
以前的答案是错误的:rm
当 dir 不存在时,不要以错误代码 > 0 退出。
相反,我建议使用:
dir='/path/to/dir'
if [[ -d $dir ]]; then
rm -rf "$dir"
fi
如果要rm
返回状态,请删除-f
标志。
Linux Mint 上的示例(目录不存在):
$ rm -rf /tmp/sdfghjklm
$ echo $?
0
$ rm -r /tmp/sdfghjklm
$ echo $?
1