#!/bin/sh
error_handle() {
stty echo;
}
if [ ${#@} -ne 0 ] && [ "${@#"--silent"}" = "" ]; then
stty -echo;
trap error_handle INT;
trap error_handle TERM;
trap error_handle KILL;
trap error_handle EXIT;
fi;
# ...
用动画的方式显示进度
有些命令需要运行很长时间,并非所有脚本都提供了进度条。在用户等待异步任务完成时,可以通过一些方式告诉他们脚本仍在运行。比如在while循环中打印一些信息:
#!/bin/sh printf -- 'Performing asynchronous action..'; ./trigger-action; DONE=0; while [ $DONE -eq 0 ]; do ./async-checker; if [ "$?" = "0" ]; then DONE=1; fi; printf -- '.'; sleep 1; done; printf -- ' DONE!n';
或者可以做一些更好玩的小玩意儿,比如 http://mywiki.wooledge.org/BashFAQ/034。
用颜色编码输出
在脚本中调用其他二进制文件或脚本时,对它们的输出进行颜色编码,这样就可以知道哪个输出来自哪个脚本或二进制文件。这样我们就不需要在满屏的黑白输出文本中查找想要的输出结果。
理想情况下,脚本应该输出白色(默认的,前台进程),子进程应该使用灰色(通常不需要,除非出现错误),使用绿色表示成功,红色表示失败,黄色表示警告。
#!/bin/sh printf -- 'doing something... n'; printf -- ' 33[37m someone else's output 33[0mn'; printf -- ' 33[32m SUCCESS: yay 33[0mn'; printf -- ' 33[33m WARNING: hmm 33[0mn'; printf -- ' 33[31m ERROR: fubar 33[0mn';
可以使用 33[Xm,其中X代表颜色代码。有些脚本使用e而不是 33,但要注意e不适用于所有的 UNIX 系统。

正确示范
可在.sh 中使用的所有颜色和修饰符 https://misc.flogisoft.com/bash/tip_colors_and_formatting。
出现错误立即退出脚本
set -e表示从当前位置开始,如果出现任何错误都将触发EXIT。相反,set +e表示不管出现任何错误继续执行脚本。
如果脚本是有状态的(每个后续步骤都依赖前一个步骤),那么请使用set -e,在脚本出现错误时立即退出脚本。如果要求所有命令都要执行完(很少会这样),那么就使用set +e。
#!/bin/sh set +e; ./script-1; ./script-2; # does not depend on ./script-1 ./script-3; # does not depend on ./script-2 set -e; ./script-4; ./script-5; # depends on success of ./script-4 # ...
自己执行清理工作
大多数脚本在出现错误时不会执行清理工作,能够做好这方面工作的脚本实属罕见,但这样做其实很有用,还可以省下不少时间。前面已经给出过示例,让stty恢复正常,并借助trap命令来执行清理工作:










