我想以一种良好的做法来编写shell脚本。
一位经验丰富的程序员朋友建议为每个外部命令使用完整路径名,以避免出现别名,函数等问题,碰巧使用与现有二进制文件相同的名称,甚至出于恶意原因。我理解该参数,但是短命令(在$ PATH中)很快变长,例如:
sudo socketfilterfw --setloggingmode on
成为
/usr/bin/sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setloggingmode on
这使得快速掌握脚本对我来说有点困难。但是也许我只需要习惯一下。 查看github上脚本的示例,我确实发现人们在做相同的事情,但大多数人没有。
是否使用二进制的完整路径被认为是“良好实践”?
答案 0 :(得分:1)
否,通常建议的做法是依靠PATH
来正确;或者有时,如果您知道某个程序的预期位置(通常不在PATH
上),请增加PATH
;
PATH="$PATH:/usr/libexec/ApplicationFirewall"
sudo socketfilterfw --setloggingmode on
对二进制文件的路径进行硬编码意味着您无法轻松地使用自定义的包装程序将其替换以进行本地管理或调试;只会使每个人的生活更加艰难。
顺便说一句,常见(但无害)错误是export
PATH
的不必要的错误。除非您需要脚本的子进程继承该变量,否则无需export
。 (而且在实践中,您通常可以确定用户已经在其登录Shell中完成了该操作;尽管对于并非总是从交互式Shell运行的系统进程,这不一定是给定的。)