![大量 sudo](https://linux22.com/image/715304/%E5%A4%A7%E9%87%8F%20sudo.png)
我正在尝试编写一个脚本,从具有自定义模块的源构建 Nginx...我想以一种干净的方式完成此操作,而不需要在新版本发布后更新版本号。
到目前为止我得到的信息如下:
sudo mkdir -p /opt && cd /opt
# Fetch Module(s)
sudo git clone https://github.com/AirisX/nginx_cookie_flag_module.git
# Update Apt Repositories
sudo add-apt-repository -y ppa:nginx/stable
sudo sed -i "s/# deb-src/deb-src/" /etc/apt/sources.list.d/nginx-ubuntu-stable-xenial.list
sudo apt-get update
# Fetch Nginx Sources/Dependencies
sudo mkdir -p /opt/rebuildnginx && cd /opt/rebuildnginx
sudo apt-get dpkg-dev
sudo apt-get source -y nginx
sudo apt-get build-dep -y nginx
# Add Module(s) To Nginx Rules
sudo perl -p0i -e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' /opt/rebuildnginx/nginx-1.12.1/debian/rules
我目前对此有两个问题,都与最后一行有关。
- 功能:它在路径中有一个硬编码版本...我该如何重写它以自动获取路径?
- 美学:最后一行相当长...我该如何缩短它?我尝试将其分解为变量,但我对 BASH 或 Perl 的理解不够深入,几次尝试都无法让它工作。
答案1
大量 sudo
为了摆脱每一sudo
行考虑请求 root。
不要重复自己
您的/opt/rebuildnginx
目录在 3 个不同的地方使用。它应该是一个变量。我会使用它BUILDBASE
作为变量名或类似名称。
硬编码路径
我以为你可以从中找到它,apt-cache
但那些版本看起来与你的不同。如果你之前没有为以前版本的 nginx 运行过此脚本,那么它应该有效:
VERSION=`ls -d nginx*`
RULES="/opt/rebuildnginx/$VERSION/debian/rules"
以下是一个示例:
$ VERSION=`ls -d nginx*`
$ echo $VERSION
nginx-1.12.1
$ RULES="/opt/rebuildnginx/$VERSION/debian/rules"
$ echo $RULES
/opt/rebuildnginx/nginx-1.12.1/debian/rules
为了确保可靠性,rm -rf /opt/rebuildnginx
每次您都可以这样做。您可能还需要在克隆之前检查git clone
d 目录是否存在,以使您的脚本可以重新运行。
缩短最后一行
我们可以对您的最后一行做一些事情。首先,让我们将其分成几行:
sudo perl -p0i \
-e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' \
/opt/rebuildnginx/nginx-1.12.1/debian/rules
然后我们可以使用上一节中的文件名变量:
sudo perl -p0i \
-e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' \
"$RULES"
您还可以将 Perl 表达式转换为双引号字符串,并使用变量构建它,但我认为这会更混乱,更难调试。坚持使用单引号字符串是一个不错的选择,至少现在文件名不会隐藏在屏幕边缘之外。
我怀疑您是否需要前面的所有空格--add-dynamic-module
。如果不需要,则需要删除一些空格。或者,\t\t\t\t
如果可以接受制表符,则可以使用制表符代替长空格。