为什么脚本在变量中定义常用命令?
我看到这一切的时候在我工作的地方:为什么脚本在变量中定义常用命令?
#!/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/cat
当cat
已经指/usr/bin/cat
?我错过了什么吗?这似乎是不必要的多余。
使用完整路径名可确保脚本正常运行,即使它由定制其环境变量的用户运行,以便它找到不同于脚本期望的这些命令的不同版本。
使用变量简化了脚本的编写,因此您不必在每次出现脚本时都写入命令的完整路径名。
欢迎来到没有被视为理所当然的企业。
这些通常被定义为确保版本正确,或者在多个盒子上执行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
在需要的地方(或更可能是不同的make
或grep
或sed
)。另一方面,人们希望避免可信脚本行为的潜在不安全外部影响。在shell变量中定义命令的完整路径,然后使用该变量运行命令即可实现这些目标。要避免这种情况,仍然有忽视用户环境的安全
的方法之一是明确地阐明脚本变量
#!/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
有可能是别人:检查程序的手册页你在你的代码中使用。
可能不是一个现实的问题,但自定义路径不适合使用,例如'/ usr/bin/cat'而不是'/ bin/cat'。 – chepner
谢谢!我知道这背后肯定有一些原因。 – R4F6