Триггер PL/Perl не может использовать переменные ENV, определенные в.bashrc

Я пытаюсь использовать переменную окружения (например, HOME) внутри триггера PL/perl в postgresql, и она кажется пустой.

Бег printenv | grep HOME в терминале возвращает нужный путь.

Я определяю триггер как

CREATE EXTENSION IF NOT EXISTS plperlu;

CREATE OR REPLACE FUNCTION update_solved() RETURNS trigger AS $update_solved$
  elog(NOTICE, "Hello");
  elog(NOTICE, $ENV{'HOME'});

  return;
$update_solved$ LANGUAGE plperlu;

Когда запрос активирует триггер, я получаю вывод

NOTICE:  Hello
NOTICE: 

Я проверил, что%ENV содержит внутри скрипта (используя use Data::Dumper; elog(NOTICE, Dumper(%ENV));:

$VAR1 = 'LANG';
$VAR2 = 'en_US.UTF-8';
$VAR3 = 'LC_TIME';
$VAR4 = 'C';
$VAR5 = 'LC_MONETARY';
$VAR6 = 'C';
$VAR7 = 'PGSYSCONFDIR';
$VAR8 = '/etc/postgresql-common';
$VAR9 = 'PG_GRANDPARENT_PID';
$VAR10 = '513';
$VAR11 = 'PGLOCALEDIR';
$VAR12 = '/usr/share/locale';
$VAR13 = 'LC_CTYPE';
$VAR14 = 'en_US.UTF-8';
$VAR15 = 'LC_COLLATE';
$VAR16 = 'en_US.UTF-8';
$VAR17 = 'PGDATA';
$VAR18 = '/var/lib/postgresql/9.6/main';
$VAR19 = 'LC_MESSAGES';
$VAR20 = 'en_US.UTF-8';
$VAR21 = 'LC_NUMERIC';
$VAR22 = 'C';
$VAR23 = 'PWD';
$VAR24 = '/var/lib/postgresql';
$VAR25 = 'PG_OOM_ADJUST_FILE';
$VAR26 = '/proc/self/oom_score_adj';

Знаете ли вы, как я могу установить необходимые мне env-переменные, которые определены в терминальной сессии, для использования внутри триггера PL/perl?

1 ответ

Несмотря на то, что вы правильно вызываете ненадежный вариант PL/Perl для plperlu, начальная среда остается такой же ограниченной средой, что и для обычного "доверенного" PL/Perl.

Одним из решений было бы запустить вспомогательную оболочку, которая затем инициализирует свою среду. Что-то вроде:

my $home = `bash -lc "echo \$HOME"`;

Возможно, вам придется настроить аргументы bash, чтобы получить то, что вы хотите. Приведенная выше команда явно запускает bash, так как я не уверен, какая оболочка по умолчанию у вас будет, и вы упомянули ваш.bashrc, так что может потребоваться ключ -l, чтобы убедиться, что его читают.

Вы также можете явно прочитать нужную информацию из произвольного текстового файла в системе, что может быть проще, чем возиться с переменными среды.

Другие вопросы по тегам