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
尽管每次路径更改时我都必须修改脚本。
所以我的问题更多的是一个最佳实践问题,而不是寻求特定问题的解决方案(尽管它是一个特定的问题),以涵盖以下一共而不是我阅读的关于每篇文章的文章和问题:
- 按照我使用的方式组织对 shell 脚本的调用是个坏主意吗?
- 使用
$(dirname "[=14=]")
之类的方式引用脚本的路径是个坏主意吗?如果是这样,您将如何维护多个 shell 文件的组织?
- 在考虑#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:
作为先决条件放在您需要的包上。
所以我一直很想问这个问题,但不想冒因此而失去声誉的风险,但是在这一点上我真的需要一些直接的意见。我是一个 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
尽管每次路径更改时我都必须修改脚本。
所以我的问题更多的是一个最佳实践问题,而不是寻求特定问题的解决方案(尽管它是一个特定的问题),以涵盖以下一共而不是我阅读的关于每篇文章的文章和问题:
- 按照我使用的方式组织对 shell 脚本的调用是个坏主意吗?
- 使用
$(dirname "[=14=]")
之类的方式引用脚本的路径是个坏主意吗?如果是这样,您将如何维护多个 shell 文件的组织? - 在考虑#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:
作为先决条件放在您需要的包上。