eval이 명령 대체와 함께 작동하지 않는 이유는 무엇입니까? [폐쇄]

eval이 명령 대체와 함께 작동하지 않는 이유는 무엇입니까? [폐쇄]

나는이 명령을 가지고

$("${DIR}/test.py" "$1")

그 출력은

export SOME_VAR="hello world"
export ANOTHER_VAR="hello"

하지만eval $("${DIR}/test.py" "$1")

아무 일도 일어나지 않은 것 같습니다. 내가 뭘 잘못했나요?

이러한 변수를 쉘 스크립트로 내보내고 싶습니다.

완전한 bash 스크립트:

#!/bin/bash     
DIR="$(cd `dirname $0` && pwd)" 
eval $("${DIR}/test.py" "$2") 
exit $? 

Python 스크립트(완전한 스크립트는 아니지만 좋은 아이디어를 제공합니다):

#!/usr/local/bin/python3 
print('export var1="{0}"\nexport var2="{1}"\nexport var3="{2}"\nexport var4="{2}"'.format(string1, string2, string3))

답변1

주어진 예는 나에게도 효과가 있지만 잠재적인 문제의 원인이 있습니다. 정의된 값에 따라 단어 분리 및 와일드카드 확장을 방지하기 위해 명령 대체 주위에 큰따옴표를 사용해야 할 수도 있습니다.

eval "$("${DIR}/test.py" "$1")"

적어도 출력에 개행으로 구분된 여러 명령이 포함되어 있는 경우 큰따옴표가 없으면 문제가 발생할 수 있습니다. 큰따옴표가 없으면 출력이 공백(보통 공백, 탭, 줄 바꿈)을 기준으로 "단어"로 분할된 다음 eval공백으로 연결되기 때문입니다. 최종 결과: 모든 줄 바꿈은 공백으로 변환되므로 별도의 줄이어야 하는 모든 명령이 하나의 길고 혼란스러운 명령으로 뒤섞여 있습니다.

극단적인 예를 들어, test.py의 출력이 다음과 같다고 가정합니다.

# Define some variables:
export SOME_VAR="6 * 5"

분할-확장-병합 프로세스는 다음과 같은 결과 명령을 제공합니다.

# Define some variables: export SOME_VAR="6 file1.txt file2.txt otherfile.png 5"

(여기서 "file1.txt file2.txt otherfile.png"는 현재 디렉터리의 모든 파일입니다.) 이것은 전혀 원하는 것이 아닙니다.

답변2

문제는 source변수를 현재 쉘로 내보내는 것이 허용되지 않는다는 것입니다.

관련 정보