plsh

PL/sh 程序语言

概览

扩展包名版本分类许可证语言
plsh1.20220917LANGMITC
ID扩展名BinLibLoadCreateTrustReloc模式
3080plsh-
相关扩展plpgsql pg_cron pg_task pg_tle plperl plperlu plpython3u plv8

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.202209171817161514plsh-
RPMPGDG1.202209171817161514plsh_$v-
DEBPGDG1.202209171817161514postgresql-$v-plsh-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 plsh 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install plsh;          # 当前活跃 PG 版本安装
pig ext install -y plsh -v 18  # PG 18
pig ext install -y plsh -v 17  # PG 17
pig ext install -y plsh -v 16  # PG 16
pig ext install -y plsh -v 15  # PG 15
pig ext install -y plsh -v 14  # PG 14
dnf install -y plsh_18       # PG 18
dnf install -y plsh_17       # PG 17
dnf install -y plsh_16       # PG 16
dnf install -y plsh_15       # PG 15
dnf install -y plsh_14       # PG 14
apt install -y postgresql-18-plsh   # PG 18
apt install -y postgresql-17-plsh   # PG 17
apt install -y postgresql-16-plsh   # PG 16
apt install -y postgresql-15-plsh   # PG 15
apt install -y postgresql-14-plsh   # PG 14

创建扩展

CREATE EXTENSION plsh;

用法

plsh: PL/sh Shell 过程语言

plsh 允许将 PostgreSQL 函数编写为 Shell 脚本。函数体必须以 shebang 行开头,指定解释器。

CREATE EXTENSION plsh;

创建 Shell 函数

CREATE FUNCTION concat(text, text) RETURNS text AS '
#!/bin/sh
echo "$1$2"
' LANGUAGE plsh;

SELECT concat('hello ', 'world');  -- 'hello world'

参数传递

函数参数作为位置 Shell 变量($1$2 等)传递:

CREATE FUNCTION file_line_count(filename text) RETURNS int AS '
#!/bin/sh
wc -l < "$1"
' LANGUAGE plsh;

返回值

  • 标准输出成为返回值(尾部换行符被去除)
  • 空输出返回 NULL
  • 标准错误输出会导致函数中止,并将其作为错误消息
  • 非零退出状态会触发错误
CREATE FUNCTION system_uptime() RETURNS text AS '
#!/bin/sh
uptime
' LANGUAGE plsh;

数据库访问

不支持直接 SPI 访问,但由于 libpq 环境变量已预配置,可以使用 psql

CREATE FUNCTION query_db(x int) RETURNS text AS $$
#!/bin/sh
psql -At -c "SELECT name FROM users WHERE id = $1"
$$  LANGUAGE plsh;

触发器函数

触发器上下文通过环境变量提供:

变量说明
PLSH_TG_NAME触发器名称
PLSH_TG_WHENBEFOREINSTEAD OFAFTER
PLSH_TG_LEVELROWSTATEMENT
PLSH_TG_OPDELETEINSERTUPDATETRUNCATE
PLSH_TG_TABLE_NAME目标表名
PLSH_TG_TABLE_SCHEMA目标表所在模式

事件触发器变量:PLSH_TG_EVENTPLSH_TG_TAG

内联执行

DO E'#!/bin/sh\necho "running shell command"' LANGUAGE plsh;

安全性

plsh 不应声明为 TRUSTED,因为 Shell 脚本在 PostgreSQL 用户权限下具有完全的操作系统级访问权限。只有超级用户应创建 plsh 函数。


最后修改 2026-03-14: update extension metadata (953cbd0)