为什么脚本在变量中定义常用命令?

问题描述:

我看到这一切的时候在我工作的地方:为什么脚本在变量中定义常用命令?

#!/bin/sh 

..... 

CAT=/usr/bin/cat         # An alias for cat 
MAIL=/usr/bin/mail        # An alias for mail 
WC=/usr/bin/wc         # An alias for word count 
GREP=/usr/bin/grep        # An alias for grep 
DIRNAME=/usr/bin/dirname       # An alias for dirname 
RM=/usr/bin/rm         # An alias for rm 
MV=/usr/bin/mv         # An alias for mv 

..... 

难道只是我的公司做这个?是否有理由说明这些非常常见的命令在哪里?为什么我需要$CAT参考/usr/bin/catcat已经指/usr/bin/cat?我错过了什么吗?这似乎是不必要的多余。

使用完整路径名可确保脚本正常运行,即使它由定制其环境变量的用户运行,以便它找到不同于脚本期望的这些命令的不同版本。

使用变量简化了脚本的编写,因此您不必在每次出现脚本时都写入命令的完整路径名。

+0

谢谢!我知道这背后肯定有一些原因。 – R4F6

欢迎来到没有被视为理所当然的企业。

这些通常被定义为确保版本正确,或者在多个盒子上执行env设置。

https://github.com/torvalds/linux/blob/master/tools/scripts/Makefile.include#L15

这样,如果目录存在,您可以检查。

这只是我的公司吗?

是否有一个原因,你想拼出这些地方极其常见的命令?

是。

我为什么要$CAT指到/ usr /斌/猫当cat已经指/usr/bin/cat

肯定cat总是指/usr/bin/cat?如果你的脚本碰巧在路径前面有一个不同的cat的环境中运行,该怎么办?或者,在路径的早期只有一个用户控制的目录,用户可以在其中安装流氓cat命令?如果您的脚本恰好以高权限运行,那么您是否真的想让随机用户能够对系统执行任何操作?

你确定cat应该是总是指/usr/bin/cat?如果脚本安装在需要不同cat(例如/usr/local/bin/gnucat)的环境中,那么您是否希望修改一行或二十行?

我错过了什么吗?这似乎是不必要的多余。

是的,你错过了一些东西。

一想避免写出/usr/bin/cat,到处都需要运行cat,和一个希望能够选择不同的cat在需要的地方(或更可能是不同的makegrepsed)。另一方面,人们希望避免可信脚本行为的潜在不安全外部影响。在shell变量中定义命令的完整路径,然后使用该变量运行命令即可实现这些目标。要避免这种情况,仍然有忽视用户环境的安全

+0

我使用的最常见事件是通过cron作业运行脚本,其中PATH与USER或root不同。硬编码路径消除了这个问题。约翰是绝对正确的,你不能指望你假设存在的路径,所以这是一个很好的实践,或者,作为另一个答案,设置PATH,但是在读取代码方面并不明显马路。设置这样的路径也可以让你根据环境使用替代路径,例如在BSD或GNU/Linux中。 – Lizardx

+1

你对PATH是正确的,但别名是不相关的。别名不会被继承,并且它们不会在脚本中扩展,除非脚本专门启用它们。 – Barmar

+0

@Barmar,谢谢,纠正。 –

的方法之一是明确地阐明脚本变量

#!/bin/sh 

PATH=/bin:/usr/bin # maybe you need something in /usr/sbin, add that 
LC_ALL=C    # ignore the user's locale 
LD_LIBRARY_PATH=something # or unset it if you want nothing 

# then 
cat /a/file   # have confidence you're using /bin/cat 

有可能是别人:检查程序的手册页你在你的代码中使用。

+1

可能不是一个现实的问题,但自定义路径不适合使用,例如'/ usr/bin/cat'而不是'/ bin/cat'。 – chepner