因此,我一直很想问这个问题,但不想冒因它失去名声的风险,但是在这一点上,我确实需要一些直接的意见。我是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
即使每次路径更改我都必须修改脚本。
因此,我的问题比寻求解决特定问题(尽管是特定问题)更像是一个最佳实践问题,而不是我阅读的有关每个人的文章和问题,而是涵盖以下全部件:
$(dirname "$0")
之类的文字引用脚本的路径是一个坏主意。如果是这样,您还将如何维护多个外壳文件的组织?此外,如果这是一个幼稚的问题,请原谅我,我真的很想对此提供一些意见。
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:
放在需要的软件包上作为先决条件。