我正在尝试通过一些其他进程环境来获取特定的env var。
所以我一直在尝试sed命令,如下所示:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/\1/p" /proc/pid/environ
但是我得到了完整的环境文件作为输出。如果我只用一个静态字符串替换\1,我会得到该字符串加上整个环境文件:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/BLAHBLAH/p" /proc/pid/environ
我应该在最后一个例子中听到“胡言乱语”。如果我去掉空字符并使用其他测试数据集,就不会发生这种情况。
这导致我尝试将\x00转换为\x01,这似乎确实有效:
cat /proc/pid/environ | tr '\000' '\001' | sed -n "s/\x01ENV_VAR_NAME=\([^\x01]*\)\x01/\1/p"
我是不是遗漏了关于sed的一些简单的东西?或者我应该坚持使用这个变通方法?
发布于 2010-08-26 04:26:45
您可以使用gawk处理列表,将记录分隔符设置为\0
,将字段分隔符设置为=
gawk -v 'RS=\0' -F= '$1=="ENV_VAR_NAME" {print $2}' /proc/pid/environ
或者,您可以在循环中使用read
来读取每个NUL分隔的行。例如:
while read -d $'\0' ENV; do declare "$ENV"; done < /proc/pid/environ
echo $ENV_VAR_NAME
(在子shell中执行此操作,以避免破坏您自己的环境。)
发布于 2010-08-26 07:34:14
许多用C编写的程序在使用嵌入NUL的字符串时往往会失败,因为NUL会终止C样式的字符串。除非专门写来处理它。
我在命令行上使用xargs处理/proc/*/environ:
xargs -n 1 -0 < /proc/pid/environ
这为您提供了每行一个env var。如果没有命令,xargs只会回显参数。然后,您可以通过管道将grep、sed、awk等命令轻松地传递给它。
xargs -n 1 -0 < /proc/pid/environ | sed -n 's/^ENV_VAR_NAME=\(.*\)/\1/p'
我经常使用它,所以我有一个shell函数用于它:
pidenv()
{
xargs -n 1 -0 < /proc/${1:-self}/environ
}
这将为您提供特定pid的环境,如果未提供参数,则为self。
发布于 2015-09-18 05:35:20
cat /proc/PID/environ | tr '\0' '\n' | sed 's/^/export /' ;
然后根据需要进行复制和粘贴。
https://stackoverflow.com/questions/3569784
复制相似问题