在shell脚本中使用具有完整路径名的二进制文件被认为是一种好习惯吗?

时间:2019-04-04 18:33:53

标签: bash

我想以一种良好的做法来编写shell脚本。

一位经验丰富的程序员朋友建议为每个外部命令使用完整路径名,以避免出现别名,函数等问题,碰巧使用与现有二进制文件相同的名称,甚至出于恶意原因。我理解该参数,但是短命令(在$ PATH中)很快变长,例如:

sudo socketfilterfw --setloggingmode on

成为

/usr/bin/sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setloggingmode on

这使得快速掌握脚本对我来说有点困难。但是也许我只需要习惯一下。 查看github上脚本的示例,我确实发现人们在做相同的事情,但大多数人没有。

是否使用二进制的完整路径被认为是“良好实践”?

1 个答案:

答案 0 :(得分:1)

否,通常建议的做法是依靠PATH来正确;或者有时,如果您知道某个程序的预期位置(通常不在PATH上),请增加PATH;

PATH="$PATH:/usr/libexec/ApplicationFirewall"

sudo socketfilterfw --setloggingmode on

对二进制文件的路径进行硬编码意味着您无法轻松地使用自定义的包装程序将其替换以进行本地管理或调试;只会使每个人的生活更加艰难。

顺便说一句,常见(但无害)错误是export PATH的不必要的错误。除非您需要脚本的子进程继承该变量,否则无需export。 (而且在实践中,您通常可以确定用户已经在其登录Shell中完成了该操作;尽管对于并非总是从交互式Shell运行的系统进程,这不一定是给定的。)