2013-03-05 4 views
4

은 내가 디버그 할 필요가 일부 쉘 코드를 가지고, 그래서 코드는 내가 그것을 소스 할 파일소싱 ENV 출력

env > env.txt 

에 내 테스트 스크립트를 사용하여 환경을 덤프했다 test.sh : env.txt의

. ./env.txt 
echo $EXAMPLE 
echo $EXAMPLE2 

내용은 다음과 같습니다

EXAMPLE=sh /hello/command.sh 
EXAMPLE2=/just/some/path 

하지만, ENV는이 유발하는 경향이 그 값을 따옴표를 넣지 않습니다 /hello/command.sh :

때문에 명확하게 변수를 설정하는 대신 그것을 실행하려고 발견되지 $ 예를 들어 소송을 제기,이 오류를

test.sh를 얻을.

이 문제에 대한 가장 빠른 해결 방법은 무엇입니까?

+1

Hm,'set> env.txt'는 모두를 모두 설정하지만 현재 env.txt에는 도움이되지 않습니다 ... – Wrikken

+0

'env> env.txt'는 * environment * 변수들,하지만'. ./env.txt'는 Bash 변수를 * export하지 않고 설정합니다. 이게 네가 원하는거야? – ruakh

+2

일부 셸에서'set> env.txt'는 그 시점의 표준 출력을'env.txt'로 재전송합니다. 이식성을 위해서,'(set)> env.txt'를 사용하는 것이 더 안전합니다. – Idelic

답변

4
while read line; do 
    declare "$line" 
    # declare -x "$line" 
    # export "$line" 
done < env.txt 

declare-x 옵션을 사용하거나 export를 사용 명령 대신.

+0

이것이 나에게 가장 잘 맞았습니다. 감사. – paxamus

1

출력을 파일로 리디렉션하기 전에 따옴표를 추가 : 환경에 값을 내보내려면

env | sed 's/=\(.*\)/="\1"/' > env.txt 
+1

+1은 OP가 "가장 빠른 해결 방법"을 요구했기 때문에 +1하지만 매우 강력한 해결책은 아닙니다. 예를 들어, 변수 값에 줄 바꿈이나 백 슬래시 또는 달러 기호가 포함되어 있으면 중단됩니다. – ruakh

+0

나는이 같은 sed 트릭을 좋아한다, 고마워. – paxamus

1
while read line; do 
var="${line%=*}" 
value="${line##*=}" 
eval "$var=\"$value\"" 
done <env.txt 
+0

'eval'이 필요 없습니다. 매개 변수를 내보내려면'declare "$ line"'또는'$ "를 사용하십시오. – chepner