답변:
eval $(cat ...)모든 경우에 작동하지는 않습니다. 예를 들어, 줄 바꿈은 $(cat ...)에서 내용을 처리하기 전에 단일 공백으로 변환 됩니다 eval. 이것은 종종 루프 및 여기 문서와 같은 여러 줄 문을 끊습니다.
예를 들어 두 파일을 모두 사용하여 다음 파일을 시도하십시오.
for i in 1 2 3; do
echo $i
done
cat<<EOF
a
b
c
EOF
source경우 특별히 이것을 위해 만들어진 명령이므로 선호 합니다.
@glennjackman이 이미 언급했듯이 명령 대체를 인용하십시오. 그렇지 않으면 단어 분리 및 경로 이름 확장으로 인해 내용이 사라지기 전에 내용이 수정됩니다. 그리고 둘 다 파일에서 명령을 실행하지만 차이점이 있습니다.
스크립트를 소싱하면 다양한 특수 셸 변수 (주로 BASH_SOURCE, BASH_LINENO및 FUNCNAME배열) 가 수정됩니다 . 오류 메시지 인쇄 및 디버깅에 유용합니다.
return명령 ( help return)을 사용하여 소스 스크립트에서 복귀 할 수 있습니다 . eval을 사용하면 그 효과를 얻지 못합니다. 마찬가지로 마찬가지로 RETURN 트랩은 평가에 대해 트리거되지 않습니다.
스크립트를 소싱 할 때 인수를 전달할 수 있습니다. 그 평가로는 그렇게 할 수 없습니다.
eval을 사용하면 명령 대체는 파일의 전체 내용을 eval로 전달하기 전에 메모리로 읽습니다. 소스를 찾으면 bash는 파일을 읽을 때 읽습니다.
여기에서 소스, 평가 및 exec가 수행하는 작업에 대한 요약이 있습니다. http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
나는 당신이 eval을 사용하고 파일을 소스로 사용하는 것이 똑같은 일을 할 것이라고 생각합니다. 그러나 아래 첨자 내부의 변수가 어떤 경우에도 동일하게 작동하는지 확실하지 않습니다. 가능한 한 소스를 사용하는 것이 좋습니다.이 방법은 더 간단하고 코드를 더 읽기 쉽기 때문입니다.
$(cat file)->$(< file)
eval "$(cat file)"