以下のスクリプトで
#!/bin/sh
CMD="ls -al"
Z=`$CMD`
echo $Z
echo "-----"
eval $CMD
ls -al
via呼び出し$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
(スペース、タブ、改行など)ごとに新しい引数が生成されます。したがって、echo
1つの長い文字列ではなく、多くのパラメータ(スペース、タブ、または改行を含まない)が表示されます。これらのパラメータはスペースで連結されます。
したがって、解決策は、echo "$Z"
このようなIFS文字を使用して保護することです。