是否可以列出特定 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>
在开头包含一行,只是为了清晰和易读。