大量 sudo

大量 sudo

我正在尝试编写一个脚本,从具有自定义模块的源构建 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

我目前对此有两个问题,都与最后一行有关。

  1. 功能:它在路径中有一个硬编码版本...我该如何重写它以自动获取路径?
  2. 美学:最后一行相当长...我该如何缩短它?我尝试将其分解为变量,但我对 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 cloned 目录是否存在,以使您的脚本可以重新运行。

缩短最后一行

我们可以对您的最后一行做一些事情。首先,让我们将其分成几行:

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如果可以接受制表符,则可以使用制表符代替长空格。

相关内容