首页 > 解决方案 > 引用其他 shell 文件的 shell 文件以及调用它们的最佳方式

问题描述

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

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

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

我对绝对路径与相对路径、采购与调用、bash 与 shell 以及引用脚本路径作为 CWD 外部相对路径调用的解决方案的各种方法进行了大量特定于 Linux 的阅读,但在结尾那天我离我感觉良好的解决方案没有更近一步,也许永远也不会。现在我满足于使用存储在变量中的绝对路径,例如:

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

即使每次路径更改时我都必须修改脚本。

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

  1. 以我正在使用的方式组织对 shell 脚本的调用是一个坏主意吗?
  2. 使用类似$(dirname "$0"). 如果是这样,您将如何维护多个 shell 文件的组织?
  3. 在考虑诸如 #2 之类的问题时,重要的是要考虑其他人对脚本的所有可能用途(即:如果有子目录并且它是来源的),或者说“这个脚本只能被调用,而不是来源”就足够了,如果有人滥用它,那么它就在他们身上。” 对不起,我不能说得更好。

另外,如果这是一个幼稚的问题,请原谅我,我真的很想对此提出一些意见。

标签: linuxshellrelative-path

解决方案


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

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

或有点类似

#!/bin/sh
PATH="$(dirname "$0")":$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:


推荐阅读