Shell 个文件引用其他 shell 个文件以及调用它们的最佳方式

Shell files referencing other shell files and the best way to call them

所以我一直很想问这个问题,但不想冒因此而失去声誉的风险,但是在这一点上我真的需要一些直接的意见。我是一个 Linux 新手,使用 Raspberry Pi 设置一个 LAMP 服务器,我喜欢为我的所有安装命令创建 shell 文件,但我也喜欢保留一些东西模块化,例如:

#!/bin/sh
#LAMPinstall.sh
./apacheinstall.sh
./mysqlinstall.sh
./phpinstall.sh

我习惯了此类调用微不足道的编码环境,但此脚本的明显问题是它要求当前工作目录是调用时脚本的目录。

我做了很多 Linux-关于绝对路径与相对路径、来源与调用、bash 与 shell 的特定阅读,以及引用脚本路径的各种方法作为 CWD 外部相对路径调用的解决方案,但在一天结束时,我并没有接近我感觉良好的解决方案,也许永远不会。现在我满足于使用存储在变量中的绝对路径,例如:

#!/bin/sh
#LAMPinstall.sh
thisdir=/path/to/scripts
${thisdir}/apacheinstall.sh
${thisdir}/mysqlinstall.sh
${thisdir}/phpinstall.sh

尽管每次路径更改时我都必须修改脚本。

所以我的问题更多的是一个最佳实践问题,而不是寻求特定问题的解决方案(尽管它是一个特定的问题),以涵盖以下一共而不是我阅读的关于每篇文章的文章和问题:

  1. 按照我使用的方式组织对 shell 脚本的调用是个坏主意吗?
  2. 使用 $(dirname "[=14=]") 之类的方式引用脚本的路径是个坏主意吗?如果是这样,您将如何维护多个 shell 文件的组织?
  3. 在考虑#2 时,重要的是要考虑其他人对您的脚本的所有可能使用(即:如果有子目录并且它是来源的),还是说 "This script must only be called, not sourced, if someone misuses it then it's on them."抱歉,我无法用更好的措辞表达。

此外,如果这是一个幼稚的问题,请原谅我,我真的很想就此发表一些意见。

shell 没有提供非常复杂的工具来维护相关脚本库。常见的技巧包括您建议的或至少暗示的

#!/bin/sh
here="$(dirname "[=10=]")"
"$here"/apacheinstall.sh
"$here"/mysqlinstall.sh
"$here"/phpinstall.sh

或有点类似

#!/bin/sh
PATH="$(dirname "[=11=]")":$PATH
apacheinstall.sh
mysqlinstall.sh
phpinstall.sh

或要求用户设置合适的变量:

#!/bin/sh
: ${LAMP_INSTALL_PATH?Need this variable to be set}
"$LAMP_INSTALL_PATH"/apacheinstall.sh
"$LAMP_INSTALL_PATH"/mysqlinstall.sh
"$LAMP_INSTALL_PATH"/phpinstall.sh

类似的相关技术是默认为 /usr/local/lib/lampinstall 之类的东西,并允许用户通过类似的方式覆盖此路径。

#!/bin/sh
: ${LAMP_INSTALL_PATH=/usr/local/lib/lampinstall}
"$LAMP_INSTALL_PATH"/apacheinstall.sh
"$LAMP_INSTALL_PATH"/mysqlinstall.sh
"$LAMP_INSTALL_PATH"/phpinstall.sh

当然,对于任何相当现代的发行版,这个特定问题的真正解决方案是将您需要的东西打包到一个包中,然后安装它。例如,在 Debianish 平台上,

sudo apt install -y local-lamp-stuff

您只需要创建 local-lamp-stuff.deb 并将其 Depends: 作为先决条件放在您需要的包上。