명령 실행 평가와 명령 실행 결과를 변수에 할당하는 것의 차이점

명령 실행 평가와 명령 실행 결과를 변수에 할당하는 것의 차이점

아래 스크립트에서

#!/bin/sh

CMD="ls -al"

Z=`$CMD`

echo $Z

echo "-----"

eval $CMD

ls -alvia 호출 $CMD과 eval 호출의 실질적인 차이점은 무엇입니까? 두 번째 경우의 인쇄된 출력에는 줄 바꿈이 없는데 직접 eval출력에서는 이를 유지하는 이유는 무엇입니까?

▶ ./test.sh
total 8 drwxr-xr-x 6 pkaramol staff 192 Dec 1 00:33 . drwx------@ 9 pkaramol staff 288 Dec 1 00:32 .. -rw-r--r-- 1 pkaramol staff 0 Dec 1 00:33 file1.txt -rw-r--r-- 1 pkaramol staff 0 Dec 1 00:33 file2.txt -rw-r--r-- 1 pkaramol staff 0 Dec 1 00:33 file3.txt -rwxr-xr-x 1 pkaramol staff 73 Dec 1 00:32 test.sh
-----
total 8
drwxr-xr-x  6 pkaramol  staff  192 Dec  1 00:33 .
drwx------@ 9 pkaramol  staff  288 Dec  1 00:32 ..
-rw-r--r--  1 pkaramol  staff    0 Dec  1 00:33 file1.txt
-rw-r--r--  1 pkaramol  staff    0 Dec  1 00:33 file2.txt
-rw-r--r--  1 pkaramol  staff    0 Dec  1 00:33 file3.txt
-rwxr-xr-x  1 pkaramol  staff   73 Dec  1 00:32 test.sh

답변1

echo $Z단어 분할을 인용하지 않았기 때문에 개행 문자가 제거되었습니다.

실행 전에 echo각 문자 $IFS(예: 공백, 탭 및 줄 바꿈) 에 대해 새 인수가 생성됩니다. 따라서 echo하나의 긴 문자열이 아니라 많은 매개변수(공백, 탭 또는 줄 바꿈을 포함하지 않음)가 표시됩니다. 이러한 매개변수는 공백으로 연결됩니다.

따라서 해결책은 echo "$Z"이와 같은 IFS 문자를 사용하여 보호하는 것입니다.

관련 정보