대화형 셸을 프로그래밍 방식으로 읽으려는 환경을 생각해 보세요. 이제 셸을 시작하고 실행 /usr/bin/env
하고 출력을 캡처하는 것이 좋은 솔루션인 것 같습니다. 그러나 변수 값에 개행 문자가 있을 수 있다는 사실을 깨닫는 순간까지는 다음과 같습니다.
$ export LINE0='VALUE0
> LINE1=VALUE1'
$ env | grep ^LINE
LINE0=VALUE0
LINE1=VALUE1
env -0
따라서 (-구분된 항목)의 출력을 캡처하는 것이 NULL
더 나은 접근 방식처럼 보이지만 이는 GNU에서만 작동하므로 env
대부분 Linux에만 해당됩니다.
NULL
표준 명령줄 도구( // 는 사용할 수 있지만 awk
허용되지 않음 )를 사용하여 분리된 환경 변수 목록을 가져오는 이식 가능한(POSIX 또는 BSD) 방법이 있습니까 perl
?python
ruby
답변1
당신의 계획이 무엇인지 알고 싶습니다다시 덮다zsh를 제외한 어떤 쉘도 해당 변수에서 nul 바이트를 지원하지 않기 때문에 캡처된 환경입니다.
awk
어쨌든, escape \
as \\
및 newline as를 사용할 수 \n
있으며 여전히 개행 문자를 사용하여 name=val
항목을 구분할 수 있습니다.
awk 'BEGIN{
for(e in ENVIRON){
v = e "=" ENVIRON[e];
gsub(/\\/, "&&", v); gsub(/\n/,"\\n",v); print v
}
}'
fzd$ env - $'foo\\bar\nquux=foo\\bar\nquux' lol=cat printenv
lol=cat
foo\bar
quux=foo\bar
quux
fzd$ env - $'foo\\bar\nquux=foo\\bar\nquux' lol=cat awk 'BEGIN{
for(e in ENVIRON){
v = e "=" ENVIRON[e];
gsub(/\\/, "&&", v); gsub(/\n/,"\\n",v); print v
}
}'
foo\\bar\nquux=foo\\bar\nquux
lol=cat