No roteiro a seguir
#!/bin/sh
CMD="ls -al"
Z=`$CMD`
echo $Z
echo "-----"
eval $CMD
qual é a diferença prática da invocação de ls -al
via $CMD
e eval e por que no segundo caso a saída é impressa sem novas linhas, enquanto a eval
saída direta preserva as novas linhas?
▶ ./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
Como você não citou
echo $Z
a palavra divisão, removeu as novas linhas.Antes de
echo
ser executado, cada caractere em$IFS
(ou seja, espaço, tabulação e nova linha) cria um novo argumento. Portantoecho
, não vê uma string longa, mas muitos argumentos (nenhum dos quais contém um espaço, tabulação ou nova linha). Esses argumentos são concatenados com um espaço entre eles.Então a solução é usar
echo "$Z"
para que os caracteres IFS fiquem protegidos.