在bash脚本中使用Linux命令的最佳和最正确的方法是什么?只使用ip addr show,依赖于shell路径($PATH),是正确的吗?还是应该先找到命令的路径(像whereis ip或command -v ip),将输出分配给某个变量,然后使用它?
ip addr show
$PATH
whereis ip
command -v ip
00jrzges1#
就我个人而言,我只是依赖于PATH并调用“裸”命令。如果您不信任用户的PATH,可以将其重置为最小默认值:
PATH=$(/usr/bin/getconf PATH) grep "$pattern" "$file"
6ie5vjzr2#
老问题了,具体来说,它实际上不能完全回答,因为我们不知道脚本何时运行的环境。因此:
# early pipe for smoke testing required commands hash test for false promises || exit 1
只需在脚本中按名称排列您需要的重要的非标准命令,如果没有找到,哈希将告诉:
hash: no such command: for hash: no such command: promises
理由:在中途卡住之前,提前退出脚本失败,浪费您宝贵的时间,并可能使系统上的事务在中途打开和未完成,而是将操作引导回可以控制运行时环境的用户(fail-fast 1)。这与the accepted answer很好地结合在一起,因为您可以使用该答案来消除副作用(并由系统管理员进行授权配置),但John Kugelman后来评论说 *“使用普通命令,不要担心$PATH”*2的评论可能更好失败早,失败多,但总是失败向前。
1.快速故障,https://en.wikipedia.org/wiki/Fail-fast1.我希望我有时间写一个详细的答案。克利夫笔记:**使用纯命令,不用担心$PATH。**在变量中存储绝对命令路径是常见的反模式。$PATH是由用户控制的,所以如果设置不正确,那是他们自己的错。他们不能通过改变它来利用它;毕竟,他们总是可以手动运行脚本的命令;或者只是编辑脚本然后运行它。你只需要在提升权限时小心使用$PATH。例如,你会看到su和sudo有防止漏洞利用的保护措施。
su
sudo
blmhpbnm3#
我倾向于在路径的顶部设置实用程序的路径,避免对PATH的任何依赖。一种潜在的攻击是在运行bash脚本之前设置PATH。为每个实用程序设置路径是痛苦的,但它可以防止这种攻击。如果您正在为多个环境进行创作,其中实用程序位于不同的位置,例如Debian和MacOS,我会检查路径,例如。
[ -f /usr/bin/grep ] && GREP=/usr/bin/grep || GREP=/bin/grep
3条答案
按热度按时间00jrzges1#
就我个人而言,我只是依赖于PATH并调用“裸”命令。
如果您不信任用户的PATH,可以将其重置为最小默认值:
6ie5vjzr2#
老问题了,具体来说,它实际上不能完全回答,因为我们不知道脚本何时运行的环境。因此:
只需在脚本中按名称排列您需要的重要的非标准命令,如果没有找到,哈希将告诉:
理由:在中途卡住之前,提前退出脚本失败,浪费您宝贵的时间,并可能使系统上的事务在中途打开和未完成,而是将操作引导回可以控制运行时环境的用户(fail-fast 1)。
这与the accepted answer很好地结合在一起,因为您可以使用该答案来消除副作用(并由系统管理员进行授权配置),但John Kugelman后来评论说 *“使用普通命令,不要担心
$PATH
”*2的评论可能更好失败早,失败多,但总是失败向前。
1.快速故障,https://en.wikipedia.org/wiki/Fail-fast
1.我希望我有时间写一个详细的答案。克利夫笔记:**使用纯命令,不用担心
$PATH
。**在变量中存储绝对命令路径是常见的反模式。$PATH
是由用户控制的,所以如果设置不正确,那是他们自己的错。他们不能通过改变它来利用它;毕竟,他们总是可以手动运行脚本的命令;或者只是编辑脚本然后运行它。你只需要在提升权限时小心使用$PATH
。例如,你会看到su
和sudo
有防止漏洞利用的保护措施。blmhpbnm3#
我倾向于在路径的顶部设置实用程序的路径,避免对PATH的任何依赖。一种潜在的攻击是在运行bash脚本之前设置PATH。为每个实用程序设置路径是痛苦的,但它可以防止这种攻击。
如果您正在为多个环境进行创作,其中实用程序位于不同的位置,例如Debian和MacOS,我会检查路径,例如。