아래 스크립트에서
#!/bin/sh
CMD="ls -al"
Z=`$CMD`
echo $Z
echo "-----"
eval $CMD
ls -al
via 호출 $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 문자를 사용하여 보호하는 것입니다.