编写在不同 shell 中使用不同命令的脚本

编写在不同 shell 中使用不同命令的脚本

如何编写独立于 shell 的脚本?我希望能够运行一个将在ksh,sh和中运行的脚本bash

例如:如果我的脚本中有一行whence ls将运行于ksh而不是运行于sh,我希望能够拥有类似的内容

if (ksh)
then whence ls
if (sh)
then whereis ls

我可以使用价值$SHELL还是有其他方式?

答案1

您在 Unix shell 脚本中通常会看到的一种模式是使用由其通用函数命名的可执行文件的变量,例如$ECHO.然后,您将拥有一两个顶级函数来确定$ECHO应设置的内容。

设置完成后$ECHO,您将在整个代码中看到以下内容:

$ECHO "hi"

这使您不必在代码中添加大量 if..then..else 块,这些块与您的脚本功能无关,只与它所使用的平台解释器无关。

因此,您可以对您有兴趣根据您运行的解释器/平台进行交换的任何关键程序执行相同的操作。

if (ksh)
then
  ECHO=echo1
  FILEFIND=whence
else if (sh)
  ECHO=echo2
  FILEFIND=whereis
else
  ECHO=echo3
  FILEFIND=which
fi

你应该这样做吗?

我想说,如果您试图使脚本可移植并且您关心某些解释器或可执行文件的可用性,那么最好按照最低公分母进行编码,即/bin/sh

只需看看 Oracle 和其他公司是如何做到这一点的。他们通常提供安装程序,以便用/bin/sh.当您开始支持各种 Unix(例如 Solaris、AIX 和 Linux)时,这是最低的共同点。

看看 Novell 整理的这份指南,标题为:使脚本可移植。它涵盖了各种 shell 的沿袭以及其中几个 shell 的通用命令集,并提供了如何处理它们的微妙之处的提示。

答案2

你可能必须通过启动另一个 shell 进程来完成,就像这样......

if [ -x /bin/ksh ]
then
    output=`/bin/ksh whence ls`
fi

if [ -x /bin/sh ]
then
    output=`/bin/sh which ls`
fi

相关内容