命令执行 eval 和将命令执行结果赋值给变量之间的区别

命令执行 eval 和将命令执行结果赋值给变量之间的区别

在下面的脚本中

#!/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字符来受到保护。

相关内容