在下面的脚本中
#!/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字符来受到保护。