Tre*_*son 19 linux bash sed environment-variables
我正试图通过一些其他进程环境来获取特定的env var.
所以我一直在尝试一个sed命令,如:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/\1/p" /proc/pid/environ
但我得到的是完整的environ文件输出.如果我用一个静态字符串替换\ 1,我会得到该字符串加上整个environ文件:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/BLAHBLAH/p" /proc/pid/environ
我应该在最后一个例子中得到"BLAHBLAH".如果我摆脱空字符并使用其他测试数据集,则不会发生这种情况.
这导致我尝试将\ x00转换为\ x01,这似乎有效:
cat /proc/pid/environ | tr '\000' '\001' | sed -n "s/\x01ENV_VAR_NAME=\([^\x01]*\)\x01/\1/p"
我在这里错过了关于sed的简单介绍吗?或者我应该坚持这个解决方法?
cam*_*amh 33
由于NUL终止了C风格的字符串,因此用C编写的许多程序往往会因嵌入NUL的字符串而失败.除非特别写下来处理它.
我使用xargs在命令行上处理/ proc/*/environ:
xargs -n 1 -0 < /proc/pid/environ
Run Code Online (Sandbox Code Playgroud)
这为每行提供了一个env var.没有命令,xargs只是回应了这个论点.然后你可以通过管道来轻松地使用grep,sed,awk等.
xargs -n 1 -0 < /proc/pid/environ | sed -n 's/^ENV_VAR_NAME=\(.*\)/\1/p'
Run Code Online (Sandbox Code Playgroud)
我经常使用它,我有一个shell函数:
pidenv()
{
xargs -n 1 -0 < /proc/${1:-self}/environ
}
Run Code Online (Sandbox Code Playgroud)
这为您提供了特定pid的环境,如果没有提供参数,则为self.
Joh*_*ica 12
您可以使用gawk处理列表,将记录分隔符设置为\0和字段分隔符为=:
gawk -v 'RS=\0' -F= '$1=="ENV_VAR_NAME" {print $2}' /proc/pid/environ
Run Code Online (Sandbox Code Playgroud)
或者您可以read在循环中使用来读取每个NUL分隔的行.例如:
while read -d $'\0' ENV; do declare "$ENV"; done < /proc/pid/environ
echo $ENV_VAR_NAME
Run Code Online (Sandbox Code Playgroud)
(在子shell中执行此操作以避免破坏您自己的环境.)
Jas*_*sen 11
cat /proc/PID/environ | tr '\0' '\n' | sed 's/^/export /' ;
Run Code Online (Sandbox Code Playgroud)
然后根据需要复制和粘贴.
Pet*_*usu 10
尽管有一个非常古老和回答的问题,我正在添加一个非常简单的oneliner,可能更简单的获取文本输出和进一步处理:
strings /proc/$PID/environ
Run Code Online (Sandbox Code Playgroud)