![命令执行 eval 和将命令执行结果赋值给变量之间的区别](https://linux22.com/image/199155/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%20eval%20%E5%92%8C%E5%B0%86%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E8%B5%8B%E5%80%BC%E7%BB%99%E5%8F%98%E9%87%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
在下面的脚本中
#!/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字符来受到保护。