e
다음 내용이 포함된 파일(이름이 지정됨)이 있다고 가정해 보겠습니다 .
a=3 b="5 6"
각각을 별도의 매개변수로 해석하려면 어떻게 해야 합니까 env
? 즉, 다음과 동일해집니다.
$ env a=3 b="5 6" ruby -e 'p ENV["a"] p ENV["b"]' "삼" "5 6" $ env a=3 "b=5 6" ruby -e 'p ENV["a"] p ENV["b"]' "삼" "5 6"
이것은 분명히 공간상의 이유로 작동하지 않습니다.
env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'
하지만 이것도 마찬가지입니다:
IFS=$'\n' env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'
인용하면 다음과 $(cat e)
같은 결과가 발생합니다.
"1\nb=2 3" 영
답변1
이는 작업에 적합한 도구를 사용하지 않은 예입니다. env
환경 변수를 설정한 다음 다른 프로그램을 체인로드하는 유일한 도구는 아닙니다. 그리고 파일에서 변수 데이터를 읽지 않습니다.
물론 .
aka source
명령도 작업에 적합한 도구는 아닙니다.
- 파일에 실수로 쉘 명령이 포함될 수 있습니다.밖의간단한 변수 할당은 경우에 따라(구성 파일이 무엇인지에 따라) 큰 보안 허점이 될 수 있습니다.
- 질문의 예에 있는 일련의 작업은 ,
.
set에서 제공됩니다.껍데기변수, 아니환경변하기 쉬운. 자동으로 내보내지지 않습니다.
올바른 도구는 이러한 유형의 여러 도구 세트에 포함된 일반적인 체인 로딩 도구입니다.
그 중 하나는 read-conf
출신이다.Nosh 도구 세트, 이러한 구성 파일(예:/etc/rc.conf
-말하자면 - PC-BSD) 및 환경 변수 설정아니요구성 구현 및 공개데이터전체 쉘 언어 구문에 대한 파일:
jdebp% 이름 없음 리눅스 jdebp % 디렉토리 e a=3 b="5 6" jdebp % read-conf e printenv | jdebp % read-conf e printenv | 사용자=jdebp a=3 b=5 6 제드 BP%
jdebp% 이름 없음 FreeBSD jdebp % 읽기-conf /etc/rc.conf printenv | jdebp % 읽기-conf /etc/rc.conf 헤더 -n 2 cron_enable=아니요 sendmail_msp_queue_enable=아니요 제드 BP%
또 다른 도구는 Wayne Marshall의 도구입니다.runenv
범죄자로부터.
답변2
여기서는 필요하지도 않습니다 env
. Bourne과 유사한 쉘에서(파일의 sh
구문이 예제와 유사하다고 가정):
(set -a; . ./e && ruby -e 'p ENV["a"]; p ENV["b"]')
( set -a
향후의 모든 변수 할당을 환경으로 내보냅니다.)
다음과 같이 할 수도 있습니다.
cat e - << 'EOF' | paste -sd ' ' - | sh
ruby -e 'p ENV["a"]; p ENV["b"]'
EOF
즉, e
파일의 모든 줄과 Ruby 명령줄을 연결하여 sh
해석을 위한 하나의 긴 명령줄을 만듭니다(여전히 e
파일의 sh
구문이 큰따옴표가 제안하는 것과 같다고 가정). 할당이 단일 라인이라고 가정합니다.