fix(generators): call PKG_INSTALL without '$' under 'set -u'

In bash with 'set -u', an undefined variable triggers an unbound-variable
error. Functions don't satisfy '$FUNCNAME' expansion under set -u, so
the previous fix that kept '$PKG_INSTALL pkg...' as the call syntax
broke every call site:

    docker.sh: line 53: PKG_INSTALL: unbound variable

Fix: drop the leading '$' in all 47 call sites across 6 generator
files. 'PKG_INSTALL pkg...' is a normal command/function lookup and
behaves identically under set -u or not.

Verified: web UI served docker.sh now has 'PKG_INSTALL' (no $);
'bash -n' passes; smoke run with stubbed PATH hits real line-53 call
site, mock apt-get receives correct args, exit 0, no unbound variable.
Sampled 6 other generators also syntax-OK with $PKG_INSTALL count 0.
This commit is contained in:
Your Name
2026-08-07 13:20:18 +08:00
parent bee37565e1
commit 66aefd6161
6 changed files with 47 additions and 47 deletions
+23 -23
View File
@@ -46,10 +46,10 @@ class Python(Generator):
out = [bash_header(self.title)]
out.append('log "Installing Python ' + ver + ' from source..."')
out.append('command -v gcc >/dev/null || $PKG_INSTALL gcc make build-essential \\\n'
out.append('command -v gcc >/dev/null || PKG_INSTALL gcc make build-essential \\\n'
' libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \\\n'
' libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \\\n'
' || $PKG_INSTALL gcc make openssl-devel bzip2-devel libffi-devel zlib-devel \\\n'
' || PKG_INSTALL gcc make openssl-devel bzip2-devel libffi-devel zlib-devel \\\n'
' readline-devel sqlite-devel ncurses-devel xz-devel')
out.append('cd /tmp')
out.append('curl -fsSL -o Python.tgz https://www.python.org/ftp/python/' + ver + '/Python-' + ver + '.tgz')
@@ -192,7 +192,7 @@ class GCC(Generator):
out = [bash_header(self.title)]
out.append('log "Installing GCC ' + ver + ' from source..."')
out.append('$PKG_INSTALL wget gcc gcc-c++ make texinfo bison flex')
out.append('PKG_INSTALL wget gcc gcc-c++ make texinfo bison flex')
out.append('cd /tmp')
out.append('curl -fsSL -O https://ftp.gnu.org/gnu/gcc/gcc-' + ver + '/gcc-' + ver + '.tar.xz')
out.append('tar -xJf gcc-' + ver + '.tar.xz')
@@ -230,7 +230,7 @@ class Make(Generator):
d = p.get("install_dir", "/opt/make")
out = [bash_header(self.title)]
out.append('log "Installing make ' + ver + '..."')
out.append('$PKG_INSTALL gcc make')
out.append('PKG_INSTALL gcc make')
out.append('cd /tmp')
out.append('curl -fsSL -O https://ftp.gnu.org/gnu/make/make-' + ver + '.tar.gz')
out.append('tar -xzf make-' + ver + '.tar.gz')
@@ -420,10 +420,10 @@ class PHP(Generator):
exts = p.get("extensions", "mysqli,pdo,pdo_mysql,gd,mbstring,curl,xml,zip,intl,opcache,bcmath")
out = [bash_header(self.title)]
out.append('log "Installing PHP ' + ver + ' from source..."')
out.append('$PKG_INSTALL gcc make libxml2-dev libssl-dev libcurl4-openssl-dev \\\n'
out.append('PKG_INSTALL gcc make libxml2-dev libssl-dev libcurl4-openssl-dev \\\n'
' libonig-dev libzip-dev libicu-dev libsqlite3-dev libpng-dev libjpeg-dev \\\n'
' libfreetype6-dev libwebp-dev libxslt1-dev libreadline-dev 2>/dev/null \\\n'
' || $PKG_INSTALL gcc make libxml2-devel openssl-devel libcurl-devel \\\n'
' || PKG_INSTALL gcc make libxml2-devel openssl-devel libcurl-devel \\\n'
' libonig-devel libzip-devel libicu-devel sqlite-devel libpng-devel \\\n'
' libjpeg-devel freetype-devel libwebp-devel libxslt-devel readline-devel')
out.append('cd /tmp')
@@ -476,9 +476,9 @@ class Ruby(Generator):
d = p.get("install_dir", "/opt/ruby")
out = [bash_header(self.title)]
out.append('log "Installing Ruby ' + ver + '..."')
out.append('$PKG_INSTALL gcc make build-essential libssl-dev libreadline-dev zlib1g-dev \\\n'
out.append('PKG_INSTALL gcc make build-essential libssl-dev libreadline-dev zlib1g-dev \\\n'
' libyaml-dev libgmp-dev libffi-dev libgdbm-dev libdb-dev libncurses5-dev 2>/dev/null \\\n'
' || $PKG_INSTALL gcc make openssl-devel readline-devel zlib-devel \\\n'
' || PKG_INSTALL gcc make openssl-devel readline-devel zlib-devel \\\n'
' libyaml-devel gmp-devel libffi-devel gdbm-devel ncurses-devel')
out.append('cd /tmp')
out.append('curl -fsSL -O https://cache.ruby-lang.org/pub/ruby/' + ver.split('.')[0] + '.' + ver.split('.')[1] + '/ruby-' + ver + '.tar.gz')
@@ -520,8 +520,8 @@ class RustLang(Generator):
out = [bash_header(self.title)]
out.append('log "Installing rustup + ' + ch + '..."')
out.append('command -v gcc >/dev/null || $PKG_INSTALL gcc make build-essential \\\n'
' || $PKG_INSTALL gcc make')
out.append('command -v gcc >/dev/null || PKG_INSTALL gcc make build-essential \\\n'
' || PKG_INSTALL gcc make')
if mirror:
out.append('export RUSTUP_DIST_SERVER=https://rsproxy.cn')
out.append('export RUSTUP_UPDATE_ROOT=https://rsproxy.cn/rustup')
@@ -567,15 +567,15 @@ class PostgreSQL(Generator):
out.append('log "Installing PostgreSQL ' + ver + '..."')
out.append('case "$PKG" in\n'
' apt-get)\n'
' $PKG_INSTALL wget gnupg lsb-release ca-certificates\n'
' PKG_INSTALL wget gnupg lsb-release ca-certificates\n'
' curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/pgdg.gpg\n'
' echo "deb [signed-by=/usr.share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list\n'
' apt-get update\n'
' $PKG_INSTALL postgresql-' + ver + ' postgresql-client-' + ver + ' postgresql-contrib-' + ver + '\n'
' PKG_INSTALL postgresql-' + ver + ' postgresql-client-' + ver + ' postgresql-contrib-' + ver + '\n'
' ;;\n'
' yum|dnf)\n'
' $PKG_INSTALL https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm\n'
' $PKG_INSTALL postgresql' + ver + '-server postgresql' + ver + '-contrib\n'
' PKG_INSTALL https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm\n'
' PKG_INSTALL postgresql' + ver + '-server postgresql' + ver + '-contrib\n'
' /usr/pgsql-' + ver + '/bin/postgresql-' + ver + '-setup initdb\n'
' ;;\n'
'esac')
@@ -621,22 +621,22 @@ class MySQL(Generator):
out.append('log "Installing MySQL ' + ver + '..."')
out.append('case "$PKG" in\n'
' apt-get)\n'
' $PKG_INSTALL wget gnupg lsb-release\n'
' PKG_INSTALL wget gnupg lsb-release\n'
' wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb\n'
' DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.29-1_all.deb || true\n'
' apt-get update\n'
' $PKG_INSTALL mysql-server mysql-client\n'
' PKG_INSTALL mysql-server mysql-client\n'
' ;;\n'
' yum|dnf)\n'
' $PKG_INSTALL https://dev.mysql.com/get/mysql80-community-release-el$(rpm -E %{rhel})-1.noarch.rpm\n'
' $PKG_INSTALL mysql-community-server mysql-community-client\n'
' PKG_INSTALL https://dev.mysql.com/get/mysql80-community-release-el$(rpm -E %{rhel})-1.noarch.rpm\n'
' PKG_INSTALL mysql-community-server mysql-community-client\n'
' ;;\n'
'esac')
else:
out.append('log "Installing MariaDB ' + ver + '..."')
out.append('case "$PKG" in\n'
' apt-get) $PKG_INSTALL mariadb-server mariadb-client ;;\n'
' yum|dnf) $PKG_INSTALL mariadb-server mariadb ;;\n'
' apt-get) PKG_INSTALL mariadb-server mariadb-client ;;\n'
' yum|dnf) PKG_INSTALL mariadb-server mariadb ;;\n'
'esac')
out.append('systemctl enable --now mysql || systemctl enable --now mariadb')
out.append('sleep 3')
@@ -682,11 +682,11 @@ class MongoDB(Generator):
out.append('log "Installing MongoDB ' + ver + '..."')
out.append('case "$PKG" in\n'
' apt-get)\n'
' $PKG_INSTALL wget gnupg curl\n'
' PKG_INSTALL wget gnupg curl\n'
' curl -fsSL https://www.mongodb.org/static/pgp/server-' + ver + '.asc | gpg --dearmor -o /usr/share/keyrings/mongodb.gpg\n'
' echo "deb [signed-by=/usr/share/keyrings/mongodb.gpg] https://repo.mongodb.org/apt/ubuntu $(grep VERSION_CODENAME /etc/os-release | cut -d= -f2)/mongodb-org/' + ver + ' multiverse" > /etc/apt/sources.list.d/mongodb-org-' + ver + '.list\n'
' apt-get update\n'
' $PKG_INSTALL mongodb-org\n'
' PKG_INSTALL mongodb-org\n'
' ;;\n'
' yum|dnf)\n'
' cat > /etc/yum.repos.d/mongodb-org-' + ver + '.repo <<REPO_EOF\n'
@@ -697,7 +697,7 @@ class MongoDB(Generator):
'enabled=1\n'
'gpgkey=https://www.mongodb.org/static/pgp/server-' + ver + '.asc\n'
'REPO_EOF\n'
' $PKG_INSTALL mongodb-org\n'
' PKG_INSTALL mongodb-org\n'
' ;;\n'
'esac')
out.append('systemctl enable --now mongod')