2012-06-22 3 views
2

환경 변수는 env의 출력을 혼동 할 수있다 및 E :목록 비지 박스의 모든 환경 변수 이름은 여러 값을

# env | awk -F= '{print $1}' 
A 
C 
E 
TERM 
SHELL 
USER 
MAIL 
PATH 
PWD 
LANG 
PS1 
SHLVL 
HOME 
LOGNAME 
_ 

은 그 때 나는 env 끝까지 플래그 -0를 지원하는지 알아 냈어 각 출력 그래서 bash의 값을 줄일 수 sed를 사용하여 0 바이트보다는 줄 바꿈과 라인 :

# env -0 | sed -e ':a;N;$!ba;s/\([^=]\+\)=\([^\x00]*\)\x00/\1\n/g' 
A 
TERM 
SHELL 
USER 
MAIL 
PATH 
PWD 
LANG 
PS1 
SHLVL 
HOME 
LOGNAME 
_ 

그러나 envdoes not support 플래그 -0의 비지 박스의 버전. 그것을 할 다른 방법이 있습니까?

+0

'python -c'import os와 같이 다른 스크립트 언어를 사용하여 작업 할 수 있습니까? (keys % ENV) {print $ _} ''에 대해''.join (os.environ의 x는 x에 대해 ".join (x +"\ n ") 또는'perl -le'을 출력하거나, 쉘 도구의 최소 세트? – Celada

+0

@Celada : Python을 사용하면 너무 쉬울 것입니다. :) 여기 BusyBox 만 사용할 수 있습니다. – spatar

답변

1

이것은 우아하지만 작동하는 해결책이 아닐 수 있습니다. 먼저 env의 출력에서 ​​가능한 모든 이름을 추출한 다음 셸의 확장 ${parameter:+word}을 사용하여 각 이름을 확인합니다.

env | awk -F= '/[a-zA-Z_][a-zA-Z_0-9]*=/ { 
     if (!system("[ -n \"${" $1 "+y}\" ]")) print $1 }' | sort | uniq 

PS : 동일한 변수 이름 (실제 변수 이름으로 및 다른 변수의 여러 값의 일부로서) env의 출력 여러 라인에 인쇄 할 수 있기 때문에 최종적으로는, 중복을 제거은 | sort | uniq 부분도 awk에 구현할 수 있습니다.

2

리눅스를 사용하는 경우 (busybox는 리눅스에서만 실행되었지만 잘못되었을 수도 있지만 잘못된 것일 수도 있음) /proc/self/environ에는 env -0과 같은 형태로 NUL으로 구분 된 환경이 있습니다. env -0 |< /proc/self/environ으로 바꿀 수 있습니다.

sed -e ':a;N;$!ba;s/\([^=]\+\)=\([^\x00]*\)\x00/\1\n/g' < /proc/self/environ 
+0

'/ proc/self/environ'을 파싱하는 것은 좋은 생각입니다.하지만 예제에서 사용한'sed'의 스크립트는 busybox가 일반적인 GNU sed에서와 같은 방식으로 sed를 구현하지 않습니다. sed 스크립트'sed -e '의 첫 번째 부분은 : a; N; $! ba''는 모든 행을 하나씩 축적해야합니다 (http://stackoverflow.com/questions/1251999/sed-how- can-i-replace-a-newline-n # 1252191)), busybox에서도 모든 \\ 문자를 \ n으로 바꾼다. bash와 busybox에서 다음 명령을 시도해보십시오 :'echo -ne "A \ 0B"| sed -e ': a; N; $! ba'| 헥스 덤프 -C'. – spatar