Shell
為什麼從腳本複制我的文件會出錯?
我在這裡不知所措,試圖找出基本上將幾個文件和目錄從一個地方復製到另一個地方的 shell 腳本會導致其中兩個文件(並且只有這兩個)的內容被清除的原因並替換為
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]
添加在空文件頂部的部分。有問題的兩個文件既不是很大也不是很小,唯一將它們與該目錄中的其他文件區分開來的是它們屬於 Perl-Module .pm 類型。它們的實際源目的地是
/home/xxx/xxx/deploy/KEB/_opt/ke/modules/
,而完整的目標目的地是/home/opt/ke/modules/
。腳本和手動副本/home/xxx/xxx/deploy/KEB/
當然是執行的。非常感謝任何想法/建議如何解釋這種行為或我應該尋找什麼來修復腳本。
我認為您的問題是使用
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