2010-08-25 14 views
15

Tôi đang cố gắng khám phá một số môi trường quy trình khác để có được một env var cụ thể.Sử dụng sed để có được một env var từ/proc/*/environ weirdness với x00

Vì vậy, tôi đã cố gắng một lệnh sed như:

sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/\1/p" /proc/pid/environ

Nhưng tôi nhận được như đầu ra tập tin environ đầy đủ. Nếu tôi thay thế \ 1 chỉ với một chuỗi tĩnh, tôi nhận được rằng chuỗi cộng với toàn bộ tập tin environ:

sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/BLAHBLAH/p" /proc/pid/environ

tôi chỉ nên nhận được "blahblah" trong ví dụ trước. Điều này không xảy ra nếu tôi loại bỏ các ký tự trống và sử dụng một số tập dữ liệu thử nghiệm khác.

này đưa tôi đến với thử chuyển đổi \ x00 để \ của x01, mà dường như làm việc:

cat /proc/pid/environ | tr '\000' '\001' | sed -n "s/\x01ENV_VAR_NAME=\([^\x01]*\)\x01/\1/p"

Tôi có thiếu một cái gì đó đơn giản về sed đây? Hoặc tôi nên chỉ dính vào cách giải quyết này?

Trả lời

12

Bạn có thể xử lý các danh sách với gawk, thiết lập phân cách ghi vào \0 và tách trường để =:

gawk -v 'RS=\0' -F= '$1=="ENV_VAR_NAME" {print $2}' /proc/pid/environ 

Hoặc bạn có thể sử dụng read trong một vòng lặp để đọc từng dòng NUL được phân định. Ví dụ:

while read -d $'\0' ENV; do declare "$ENV"; done < /proc/pid/environ 

echo $ENV_VAR_NAME 

(Làm điều này trong một tiểu vỏ để tránh clobbering môi trường của riêng bạn.)

+0

này cũng giải quyết vấn đề của tôi với dò dẫm xung quanh với phù hợp với người đầu tiên env var trong tệp không có \ x01 ở phía trước. Cảm ơn nhiều. –

+0

Bạn đã lưu ngày của tôi. Tôi nghĩ rằng đó là cách duy nhất để chuyển một giá trị biến động tới một dịch vụ systemd-start. –

+0

'awk' không hoạt động nếu giá trị biến chứa' = '? ví dụ: 'awk -v 'RS = \ 0' -F = '$ 1 ==" LS_COLORS "{in $ 2}' Jasen

2

Đối với một số lý do sed không phù hợp \ 0 với .

% 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 

Giải pháp: không sử dụng sed hoặc sử dụng workaround của bạn.

+0

các bước gỡ rối tuyệt vời, cảm ơn. –

31

Rất nhiều chương trình được viết bằng C có xu hướng không thành công với chuỗi có NUL được nhúng dưới dạng NUL kết thúc chuỗi kiểu C. Trừ khi được viết đặc biệt để xử lý nó.

tôi trình/proc/*/environ trên dòng lệnh với xargs:

xargs -n 1 -0 < /proc/pid/environ 

này mang đến cho bạn một env var trên mỗi dòng. Không có lệnh, xargs chỉ lặp lại đối số. Sau đó bạn có thể dễ dàng sử dụng grep, sed, awk, vv trên đó bằng cách đường ống đến nó.

xargs -n 1 -0 < /proc/pid/environ | sed -n 's/^ENV_VAR_NAME=\(.*\)/\1/p' 

tôi sử dụng này thường đủ rằng tôi có một chức năng vỏ cho nó:

pidenv() 
{ 
    xargs -n 1 -0 < /proc/${1:-self}/environ 
} 

này mang đến cho bạn môi trường của một pid cụ thể, hoặc tự nếu không có tranh luận được cung cấp.

+0

rất hay. Tôi đã không bao giờ nghĩ đến việc sử dụng xargs trong vai trò này. Tuy nhiên, tôi đã tránh loại giải pháp này ngay từ đầu vì tôi muốn tránh bất kỳ vấn đề nào với giá trị env var với \ n trong chúng. –

+0

xargs cho phép bạn dễ dàng xử lý các giá trị nhiều dòng bằng cách chạy một tập lệnh hoặc chương trình trên mỗi đối số thay vì chỉ lặp lại nó. Bằng cách này, mỗi đối số có thể được xử lý độc lập khi biết rằng mỗi khi kịch bản của bạn được gọi, nó được trình bày với một giá trị duy nhất bất kể số dòng trong đó. – camh

+0

Tuyệt vời! xargs cũng có một hiệu ứng phụ tốt đẹp của khoảng trắng cắt tỉa. echo 'foo' | xargs | wc -C# => 4 – ppetraki

10
cat /proc/PID/environ | tr '\0' '\n' | sed 's/^/export /' ; 

rồi sao chép và dán khi cần.

+0

mã này không thành công trên các biến chứa các dòng mới - nhưng nó ngắn. – Jasen

4

Mặc dù thực sự cũ và trả lời câu hỏi, tôi đang bổ sung thêm một oneliner rất đơn giản, có lẽ đơn giản hơn để nhận được sản lượng văn bản và tiếp tục xử lý:

strings /proc/$PID/environ 
+0

Đây là một câu trả lời nghiêm túc bị đánh giá thấp, làm cho nó siêu dễ dàng để đường ống vào '| grep -E '^ (ENV_NAME) =' ' –

Các vấn đề liên quan