コマンド実行評価とコマンド実行結果を変数に代入することの違い

コマンド実行評価とコマンド実行結果を変数に代入することの違い

以下のスクリプトで

#!/bin/sh

CMD="ls -al"

Z=`$CMD`

echo $Z

echo "-----"

eval $CMD

ls -alvia呼び出し$CMDとeval呼び出しの実質的な違いは何ですか? 2番目の場合の印刷された出力には改行はありませんが、直接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(スペース、タブ、改行など)ごとに新しい引数が生成されます。したがって、echo1つの長い文字列ではなく、多くのパラメータ(スペース、タブ、または改行を含まない)が表示されます。これらのパラメータはスペースで連結されます。

したがって、解決策は、echo "$Z"このようなIFS文字を使用して保護することです。

関連情報