Bash 应用程序中看不到环境变量

问题描述 投票:0回答:1

我正在尝试在 Ubuntu 22.04 上的 bash 中将密码传递给 Postgres 数据库。像这样:

export PGPASSWORD=postgrespw

当我尝试在这样的应用程序中使用它们时:

(例如 cjdb,一个处理上传到 PostgreSQL 数据库的程序,https://github.com/cityjson/cjdb:

密码可以在PGPASSWORD环境变量中指定。如果未指定,应用程序将提示输入密码。

cjdb import -H localhost -U postgres -d test -s cjdb -f src/cjdb/LoD2_326625712.jsonl

或者像这样: (martin,一个也在 PostgreSQL db 上处理一些数据库功能的程序)

martin --config config.yaml

我总是收到“缺少密码”。

直接使用 psql 会奇怪地工作:

psql -U postgres testcjdb -h localhost

上述两个程序都明确声明它们支持使用环境变量 PGPASSWORD

我怎样才能确定这是程序错误(我有点不相信),还是我的 bash 终端出了问题?

postgresql bash environment-variables
1个回答
0
投票

如果不是程序的错,你写的PR就不会起作用; PR 解决了问题这一事实本身就证明环境变量正在传递给程序,但程序忽略它(就好像变量没有传递一样,

'PGPASSWORD' in os.environ
将是错误的)。

进一步意味着您可以证明这一点令您满意:

  • 给定正在运行的程序的 PID,您可以从

    /proc/PID/environ
    读取为该程序定义的以 NUL 分隔的环境变量流。使用
    tr '\0' '\n'
    将 NUL 分隔符更改为换行符,以便于人类阅读,或确保 每个 变量都可读地打印:

    #!/usr/bin/env bash
    (( $# )) || { echo "Usage: $0 pid [pid2] ..." >&2; exit 1; }
    for pid in "$@"; do
      while IFS= read -r -d '' entry; do
        var=${entry%%=*}
        value=${entry#*=}
        printf '%s=%q\n' "$var" "$value"
      done <"/proc/$pid/environ"
    done
    

    ...可以传递 PID(或它们的列表),并且将以可打印的形式转储环境变量的值,即使它们包含换行符或其他非打印字符。

  • 在 shell 中,如果未导出字符串类型变量,

    declare -p varname
    将发出
    declare -- varname=...
    (数组将有
    declare -a
    、整数
    declare -i
    、名称变量
    declare -n
    等);或
    declare -x varname=...
    如果是(或者如果根本没有设置变量,则写入错误)。

© www.soinside.com 2019 - 2024. All rights reserved.