Linux가 아닌 시스템의 경우 /usr/bin/env -0

Linux가 아닌 시스템의 경우 /usr/bin/env -0

대화형 셸을 프로그래밍 방식으로 읽으려는 환경을 생각해 보세요. 이제 셸을 시작하고 실행 /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?pythonruby

답변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

관련 정보