RUVIDEO
Поделитесь видео 🙏

写好shell脚本的13个技巧

请观看我的频道更新消息。
订阅我:https://www.youtube.com/channel/UCfJLkrBjsBfcagYah-IDhVg?sub_confirmation=1
谢谢!作者|JosephMatthiasGoh译者|无明编辑|张婵产品的最终用户通常不懂技术,所以不管你怎么折腾产品代码都无所谓。但脚本代码不一样,它们是开发人员写给开发人员的。有多少次,你运行.cript.sh,然后输出一些东西,但却不知道它刚刚都做了些什么。这是一种很糟糕的脚本用户体验。我将在这篇文章中介绍如何写出具有良好开发者体验的shell脚本。产品的最终用户通常不懂技术,所以不管你怎么折腾产品代码都无所谓。但脚本代码不一样,它们是开发人员写给开发人员的。这样会导致一些问题:混乱的脚本——我知道,我们都是工程师,读得懂代码,但即使这样,也请为我们这些对Shell脚本不是很熟练的人考虑一下(我们在写代码时也会为你们考虑的)。满屏的日志和错误输出——就算我们也是工程师,并不代表我们了解你所做的一切。弄得一团糟却没有做好清理工作——是的,我们可以顺着你的脚本手动撤销变更,但你真的会让那些信任你的脚本的人这么做吗?所以,我们可以通过一些方法来为自己和别人写出更好的shell脚本。这里给出的所有示例都可以使用与POSIX标准兼容的shell运行 #!/bih),因为它是最常用的。嫌文章太长了可以只看以下总结部分:提供--help标记检查所有命令的可用性独立于当前工作目录如何读取输入:环境变量vs.标记打印对系统执行的所有操作如果有必要,提供--silent选项重新开启显示用动画的方式显示进度用颜色编码输出出现错误立即退出脚本自己执行清理工作在退出时使用不同的错误码在结束时打印一个新行有时间的话可以接着往下看具体内容:--help标记安装在系统上的二进制文件通常带有man帮助文档,但对于脚本来说就不一定了。因此我们通常需要为脚本提供-h或--help标记来打印有关如何使用脚本的信息。如果其他工程师需要修改脚本,这也可以作为脚本的内联文档 #!/bihif[$ #@}-ne0]&&["${ #"--help"}"=""];thenprintf--'...help...\n';exit0;fi;这段脚本先计算参数长度($ #@}-ne0),只有当参数长度不为零时才会检查--help标记。下一个条件会检查参数中是否存在字符串“--help”。第一个条件是必需的,如果参数长度为零则不需要打印帮助信息。检查所有命令的可用性脚本通常会调用其他脚本或二进制文件。在调用可能不存在的命令时,请先检查它们是否可用。可以使用“command-v二进制文件名称”来执行此操作,看看它的退出代码是否为零。如果命令不可用,可以告诉用户应该如何获得这个二进制文件 #!/bih_=$(command-vdocker);if["$?"!="0"];thenprintf--'Youdon\'tseemtohaveDockeritalled.\n';printf--'Getit:https:www.docker.com/community-edition\n';printf--'Exitingwithcode127...\n';exit127;fi #...独立于当前工作目录从不同的目录执行脚本可能会发生错误,这样的脚本没有人会喜欢。要解决这个问题,请使用绝对路径(/path/toomething)和脚本的相对路径(如下所示)。可以使用dirname$0引用脚本的当前路径 #!/bihCURR_DIR="$(dirname$0);"printf--'movingapplicationto/opt/app.jar';mv"${CURR_DIR}/application.jar"/opt/app.jar;如何读取输入:环境变量vs.标记脚本通过两种方式接受输入:环境变量和选项标记(参数)。根据经验,对于不影响脚本行为的值,可以使用环境变量,而对于可能触发脚本不同流程的值,可以使用脚本参数。不影响脚本行为的变量可能是访问令牌和ID之类的东西 #!/bi #dothisexportAWS_ACCESS_TOKEN='xxxxxxxxxxxx';./provision-everythin #andnot./provisiong-everything--token'xxxxxxxxxxx';影响脚本行为的变量可能是需要运行实例的数量、是异步还是同步运行、是否在后台运行等参数 #!/bi #dothis./provision-everything--async--itance-count40 #andnotITANCE_COUNT=400ASYNC=true./provision-everything打印对系统执行的所有操作脚本通常会对系统执行有状态的更改。不过,由于我们不知道用户何时会向发送SIGINT,也不知道脚本错误何时可能导致脚本意外终止,因此很有必要将正在做的事情打印在终端上,这样用户就可以在不去查看脚本的情况下回溯这些步骤 #!/bihprintf--'Downloadingrequireddocumentto./downloaded...';wget-o./downloadedhttps:ome.site.com/downloaded;printf--'Moving./downloadedto/opt/downloaded...';mv./downloaded/opt/;printf--'Creatingsymlinkto/opt/downloaded...';ln-s/opt/downloaded/usbidownloaded;选项有些脚本是为了将其输出传给其他脚本。虽说脚本都应该能够单独运行,不过有时候也有必要让它们把输出结果传给另一个脚本。可以利用stty-echo来实现标记 #!/bihif[$ #@}-ne0]&&["${ #"--silent"}"=""];thenstty-echo;fi #.. #beforepointofintendedoutput:stty+echo&&printf--'intendedoutput\n' #silenceitagaintillendofscriptstty-echo #...stty+echo;exit0;重新开启显示在使用stty-echo关闭脚本显示之后,如果发生致命错误,脚本将终止,而且不会恢复终端输出,这样对用户来说是没有意义的。可以使用trap来捕捉SIGINT和其他操作系统级别的信号,然后使用打开终端显示 #!/biherror_handle{sttyecho;}if[$ #@}-ne0]&&["${ #"--silent"}"=""];thenstty-echo;traperror_handleINT;traperror_handleTERM;traperror_handleKILL;traperror_handleEXIT;fi #...用动画的方式显示进度有些命令需要运行很长时间,并非所有脚本都提供了进度条。在用户等待异步任务完成时,可以通过一些方式告诉他们脚本仍在运行。比如在while循环中打印一些信息 #!/bihprintf--'Performingasynchronousaction..';./trigger-action;DONE=0;while[$DONE-eq0];do./async-checker;if["$?"="0"];thenDONE=1;fi;printf--'.';sleep1;done;printf--'DONE!\n';或者可以做一些更好玩的小玩意儿,比如http:mywiki.wooledge.org/BashFAQ/034。用颜色编码输出在脚本中调用其他二进制文件或脚本时,对它们的输出进行颜色编码,这样就可以知道哪个输出来自哪个脚本或二进制文件。这样我们就不需要在满屏的黑白输出文本中查找想要的输出结果。理想情况下,脚本应该输出白色(默认的,前台进程),子进程应该使用灰色(通常不需要,除非出现错误),使用绿色表示成功,红色表示失败,黄色表示警告 #!/bihprintf--'doingsomething...\n';printf--'\033[37msomeoneelse'soutput\033[0

Что делает видео по-настоящему запоминающимся? Наверное, та самая атмосфера, которая заставляет забыть о времени. Когда вы заходите на RUVIDEO, чтобы посмотреть онлайн «写好shell脚本的13个技巧», вы рассчитываете на нечто большее, чем просто загрузку плеера. И мы это понимаем. Контент такого уровня заслуживает того, чтобы его смотрели в HD 1080, без дрожания картинки и бесконечного буферизации.

Честно говоря, Rutube сегодня — это кладезь уникальных находок, которые часто теряются в общем шуме. Мы же вытаскиваем на поверхность самое интересное. Будь то динамичный экшн, глубокий разбор темы от любимого автора или просто уютное видео для настроения — всё это доступно здесь бесплатно и без лишних формальностей. Никаких «заполните анкету, чтобы продолжить». Только вы, ваш экран и качественный поток.

Если вас зацепило это видео, не забудьте взглянуть на похожие материалы в блоке справа. Мы откалибровали наши алгоритмы так, чтобы они подбирали контент не просто «по тегам», а по настроению и смыслу. Ведь в конечном итоге, онлайн-кинотеатр — это не склад файлов, а место, где каждый вечер можно найти свою историю. Приятного вам отдыха на RUVIDEO!

Видео взято из открытых источников Rutube. Если вы правообладатель, обратитесь к первоисточнику.