linux - 引用其他 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
即使每次路径更改时我都必须修改脚本。
因此,我的问题更像是一个最佳实践问题,而不是寻求特定问题的解决方案(尽管它是一个特定问题),而是完全涵盖以下内容,而不是我阅读的关于每篇文章的文章和问题:
- 以我正在使用的方式组织对 shell 脚本的调用是一个坏主意吗?
- 使用类似
$(dirname "$0")
. 如果是这样,您将如何维护多个 shell 文件的组织? - 在考虑诸如 #2 之类的问题时,重要的是要考虑其他人对脚本的所有可能用途(即:如果有子目录并且它是来源的),或者说“这个脚本只能被调用,而不是来源”就足够了,如果有人滥用它,那么它就在他们身上。” 对不起,我不能说得更好。
另外,如果这是一个幼稚的问题,请原谅我,我真的很想对此提出一些意见。
解决方案
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:
推荐阅读
- python - 在 Pandas 中用以前的非零值替换零时获取“TypeError:数据类型不理解”
- android - 如何使用 Rxjava 进行长时间运行的后台任务
- sql - 来自数组列的 Where 子句
- python - 如何解决“上游过早关闭”
- java - 导入后如何使用外部jar文件中的类
- python-3.x - 在使用 >python cmdArguments.py contacts.txt 1 运行程序时,为什么会引发“索引错误”?
- sql - GROUP_CONCAT 如何按子查询的配置文件分组?
- reactjs - 我没想到会遇到 React Hooks esLint 错误
- log4j2 - 将 commons-logging 连接到 slf4j-api
- android - 我正在尝试获取对我的 Firebase 数据库子项的正确引用并在我的 RecyclerView 中设置值,但我遇到了一些问题