eval $ (cat filename)은 소스 파일 이름과 동일합니까?


9

일부 bash 함수에서 작업하면서 source ...명령을 몰랐 으므로 eval $(cat ...)대신 사용 했습니다. 이제 나는 그것을 사용하는 모든 것을 바꾸어야합니까, 아니면 동일한 기능입니까?

그들은 지금 똑같이 작동하는 것처럼 보이지만 나중에 오해를 불러 일으킬 수있는 차이점이있을 수 있습니다. 알고 싶습니다.

답변:


6

eval $(cat ...)모든 경우에 작동하지는 않습니다. 예를 들어, 줄 바꿈은 $(cat ...)에서 내용을 처리하기 전에 단일 공백으로 변환 됩니다 eval. 이것은 종종 루프 및 여기 문서와 같은 여러 줄 문을 끊습니다.

예를 들어 두 파일을 모두 사용하여 다음 파일을 시도하십시오.

for i in 1 2 3; do
 echo $i
done

cat<<EOF
a
b
c
EOF

4
당신이 따옴표를 사용하는 경우, 공백은 그대로 남아있을 것입니다 :eval "$(cat file)"
글렌 잭맨

1
그렇습니다. 그러나 어쨌든 코드를 변경 해야하는 source경우 특별히 이것을 위해 만들어진 명령이므로 선호 합니다.
Florian Diesch 4

9

@glennjackman이 이미 언급했듯이 명령 대체를 인용하십시오. 그렇지 않으면 단어 분리 및 경로 이름 확장으로 인해 내용이 사라지기 전에 내용이 수정됩니다. 그리고 둘 다 파일에서 명령을 실행하지만 차이점이 있습니다.

  • 스크립트를 소싱하면 다양한 특수 셸 변수 (주로 BASH_SOURCE, BASH_LINENOFUNCNAME배열) 가 수정됩니다 . 오류 메시지 인쇄 및 디버깅에 유용합니다.

  • return명령 ( help return)을 사용하여 소스 스크립트에서 복귀 할 수 있습니다 . eval을 사용하면 그 효과를 얻지 못합니다. 마찬가지로 마찬가지로 RETURN 트랩은 평가에 대해 트리거되지 않습니다.

  • 스크립트를 소싱 할 때 인수를 전달할 수 있습니다. 그 평가로는 그렇게 할 수 없습니다.

  • eval을 사용하면 명령 대체는 파일의 전체 내용을 eval로 전달하기 전에 메모리로 읽습니다. 소스를 찾으면 bash는 파일을 읽을 때 읽습니다.


1

여기에서 소스, 평가 및 exec가 수행하는 작업에 대한 요약이 있습니다. http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html

나는 당신이 eval을 사용하고 파일을 소스로 사용하는 것이 똑같은 일을 할 것이라고 생각합니다. 그러나 아래 첨자 내부의 변수가 어떤 경우에도 동일하게 작동하는지 확실하지 않습니다. 가능한 한 소스를 사용하는 것이 좋습니다.이 방법은 더 간단하고 코드를 더 읽기 쉽기 때문입니다.


3
comletely 접선 : 배쉬을위한 속기가 $(cat file)->$(< file)
글렌 잭맨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.