나는이 명령을 가지고
$("${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
변수를 현재 쉘로 내보내는 것이 허용되지 않는다는 것입니다.