スクリプトからコピーするとファイルが破損するのはなぜですか?

スクリプトからコピーするとファイルが破損するのはなぜですか?

デフォルトでは、複数のファイルとディレクトリをある場所から別の場所にコピーするシェルスクリプトは、なぜファイルの2つ(そしてその2つのみ)の内容を消去しますlink ../../modules/[name_of_file]

APPFOLDER="/home/opt/ke"
CMD_APPCOPY="cp -fr _opt/ke/* $APPFOLDER"
[...]     
echo "copying app-files to app-folder $APPFOLDER ..."
eval $CMD_APPCOPY
if [ $? -ne 0 ] ; then
   echo "could not copy app-files to app-folder $APPFOLDER"
   exit
fi

ファイルのコピーを手動で開始すると、すべてが正常です。

cp -fr _opt/ke/* /home/opt/ke

link ../../modules/[name_of_file]ただし、スクリプトを実行すると、空のファイルの上に追加されたセクションを除いて、両方のファイルが空になります。

これら2つのファイルのサイズは非常に大きくも小さくもなく、このファイルとこのディレクトリ内の他のファイルとの間の唯一の違いはPerl-Module .pmタイプです。実際のソースターゲットは/home/xxx/xxx/deploy/KEB/_opt/ke/modules/、全体のターゲットターゲットはです/home/opt/ke/modules//home/xxx/xxx/deploy/KEB/もちろん、スクリプトとマニュアルのコピーも実行されます。

この動作を説明する方法やスクリプトを修正するために見つけなければならないことに関するアイデア/提案は大いに感謝します。

答え1

あなたの問題はeval

#!/bin/bash

CMD1=(echo "onecmd")
CMD2=(printf "%s\n" ascrip*)
CMD3='echo cmd3'

${CMD1[@]}
${CMD2[@]}
$CMD3

それを通過する必要はありませんeval

はい

$ ./ascript.bash 
onecmd
ascript.bash
cmd3

デバッグ

Bashのデバッグモードを有効にすると、後で何が起こっているかを確認できます。

$ bash -x ./ascript.bash 
+ CMD1=(echo "onecmd")
+ CMD2=(printf "%s\n" ascrip*)
+ CMD3='echo cmd3'
+ echo onecmd
onecmd
+ printf '%s\n' ascript.bash
ascript.bash
+ echo cmd3
cmd3

関連情報