Shell脚本 - 使用bin/echo而不是echo的原因?

Cod*_*rBC 2 unix shell

我有一个2011年的shell脚本,其目的是在不同的unix系统上运行.

该脚本定义了某些变量,我不理解它背后的逻辑,我想知道为什么这样做.例如:
代替使用echogrep直接在脚本中,这些变量定义如下:(
ECHO="/bin/echo"
GREP="/bin/grep"对于Linux)
对于Solaris或其他,也定义了相应的路径.然后将它们用作${ECHO} "something out"

这种做法的目的是什么?为什么我不能直接使用它?

cda*_*rke 5

正如其他人所指出的那样,这些线条不太可能正确,更可能是:

ECHO="/bin/echo"
GREP="/bin/grep"  # (for linux)
Run Code Online (Sandbox Code Playgroud)

假设它们是正确的,这样的代码曾经常见于shell脚本(不是我的,我可能会添加).你没有看到很多人使用这些.

echo:( kshKorn shell,曾经是首选的shell),csh(C-shell,Sun上的默认shell)和sh(Bourne shell之前是POSIX)都有自己的内置版本echo,略有不同(主要是围绕该-n参数).因此,独立程序/bin/echo有时用于便携性.有一个性价格要支付.

grep和其他人:过去常常建议在脚本中设置外部程序的完整路径名.主要原因是安全性.理论上,用户可以在本地目录中提供自己的版本并更改其PATH变量. PATH以及所有其他环境变量仍然被许多人视为安全风险.第二个原因是搜索目录的性能开销$PATH- 这是在跟踪别名(ksh)或散列(bash)的日子之前.

我再说一遍,我不赞同所有这些观点,多年来我与那些观点的人有过争论,但这就是解释.在我看来,这种做法导致的问题多于解决的问题.

编辑:我提到的做法可以追溯到20世纪70年代和80年代.为什么他们会在2011年的剧本中?可能是因为"我们总是这样做",又名"公司政策",即没有人知道或关心为什么,我们只是这样做.或者,它可能是来自旧网站或书籍的复制n'paste,甚至是认为这是一个好主意的人.

  • 我遇到了一个问题,即从今天开始使用`/ bin / echo`是有意义的。内置的“ echo”似乎根据外壳版本对嵌入式反斜杠转义进行了不同处理。我发现使用POSIX'-E`开关的唯一可靠方法是使用二进制版本。 (2认同)