代码之家  ›  专栏  ›  技术社区  ›  Trevor Harrison

使用sed从/proc/*/environ weirdness获取env var,使用\x00

  •  18
  • Trevor Harrison  · 技术社区  · 15 年前

    我正试图在其他一些流程环境中寻找特定的env变量。

    所以我一直在尝试一个SED命令,比如:

    sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/\1/p" /proc/pid/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"

    我错过了关于塞德的一些简单的事情吗?或者我应该坚持这个解决方法吗?

    5 回复  |  直到 8 年前
        1
  •  12
  •   John Kugelman Michael Hodel    8 年前

    您可以使用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中执行此操作以避免破坏您自己的环境。)

        2
  •  33
  •   camh    15 年前

    许多用C编写的程序往往会失败,因为nul终止了一个C样式的字符串,而字符串中有嵌入的nul。除非是专门为处理此事而写的。

    在命令行上使用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。

        3
  •  10
  •   Jasen    10 年前
    cat /proc/PID/environ  | tr '\0' '\n' | sed 's/^/export /' ; 
    

    然后根据需要复制并粘贴。

        4
  •  9
  •   Petr Matousu    8 年前

    尽管问题已经很老了,我还是添加了一个非常简单的一行程序,可能对于获取文本输出和进一步处理更简单:

    strings /proc/$PID/environ
    
        5
  •  2
  •   unbeli    15 年前

    出于某种原因,sed与\0不匹配 .

    % echo -n "\00" | xxd
    0000000: 00                                       .
    % echo -n "\00" | sed 's/./a/g' | xxd
    0000000: 00                                       .
    % echo -n "\01" | xxd                
    0000000: 01                                       .
    % echo -n "\01" | sed 's/./a/g' | xxd
    0000000: 61                                       a
    

    解决方案:不要使用SED或使用您的解决方案。

    推荐文章