列出特定 SHELL 的环境变量

列出特定 SHELL 的环境变量

是否可以列出特定 shell 会话设置的环境变量。

[root@me]who

dave     pts/1        Jan 23 03:09 (::ffff:132.39.129.11)
dave     pts/3        Jan 23 04:04 (::ffff:132.39.130.42)
patrick  pts/4        Jan 23 03:31 (::ffff:132.39.129.11)
patrick  pts/2        Jan 23 02:59 (::ffff:10.2.13.166)
jonh     pts/5        Jan 23 03:41 (132.39.130.8)
john     pts/6        Jan 23 03:53 (::ffff:132.39.130.42)
root     pts/0        Jan 23 04:04 (132.39.130.42:0)

我想知道在 pts/4 会话中设置的环境变量。

谢谢你的帮助,干杯

答案1

您可以从进程 ID 获得环境。您可以使用ps -aux它来获取给定 tty 的进程 ID。当您获得进程 ID 时,您可以使用sudo cat /proc/$PROCSSID/environ替换$PROCESSID为进程 ID 的命令 - 来转储其环境。

答案2

环境设置为一个进程,而不是一个 TTY。1 个 tty 可以同时激活多个 shell,因此可以有不同的变量集。

那么

ps -ef |grep pts/4

并记下您要调查的 shell 的进程 ID。然后查看...

more /proc/{processid}/environ

请参阅man proc 7此处以了解更多详情。

答案3

任何(有能力的)进程都可以连接到终端,不一定是 shell。但 shell 很常见,当然,也可能涉及多个 shell —— 想象一下一个 shell 生成另一个 shell,等等。

Linux 内核通过伪 FS 公开其部分内部数据结构,procfs;安装在/proc(默认)。进程的环境通常通过文件公开/proc/PID/environ

因此,您可以获取连接到特定终端的进程,然后读取文件/proc/PID/environ以获取进程的环境。此外,在文件中,变量值显示为KEY=VALUE对,变量之间用 ASCII NUL 分隔,因此您也需要处理这一点以提高可读性。

获取连接到所需终端的所有进程的 PID 并用于awk读取相关环境文件,并以换行符分隔的形式获取变量:

ps -eo pid,tty | awk -v tty='pts/4' '$2 ~ tty {"cat /proc/"$1"/environ" \
             | getline i; gsub("\\0", "\n", i); printf "PID=%s\n%s\n\n",$1, i}'

tty在传递给的变量上使用所需的终端名称awk,这里我使用了pts/4您在问题中提到的名称。输出还将PID=<pid>在开头包含一行,只是为了清晰和易读。

相关内容