Shell

為什麼從腳本複制我的文件會出錯?

  • October 11, 2013

我在這裡不知所措,試圖找出基本上將幾個文件和目錄從一個地方復製到另一個地方的 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

引用自:https://unix.stackexchange.com/questions/94632