在以下脚本中
#!/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
因为您没有引用
echo $Z
单词拆分删除了换行符。在
echo
执行之前,其中的每个字符$IFS
(即空格、制表符和换行符)都会创建一个新参数。所以echo
没有看到一个长字符串,而是很多参数(其中不包含空格、制表符或换行符)。这些参数之间用一个空格连接起来。所以解决方案是使用
echo "$Z"
这样的 IFS 字符受到保护。