Por que copiar de um script é feito com meus arquivos?

2

Eu estou perdido aqui, tentando descobrir o motivo pelo qual um script de shell que basicamente copia alguns arquivos e diretórios de um lugar para outro resultará no conteúdo de dois dos arquivos (e apenas esses dois ) sendo limpo e substituído por 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

Se eu iniciar a cópia do arquivo manualmente, tudo estará bem.

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

Mas se eu executar o script, os dois arquivos ficarão vazios, exceto pela parte link ../../modules/[name_of_file] adicionada ao topo do arquivo vazio.

Os dois arquivos em questão não são muito grandes ou muito pequenos, a única coisa que os diferencia dos outros arquivos nesse diretório é que eles são do tipo .pm do Perl-Module. Seu destino de origem real é /home/xxx/xxx/deploy/KEB/_opt/ke/modules/ , enquanto o destino de destino completo é /home/opt/ke/modules/ . O script e a cópia manual são executados a partir de /home/xxx/xxx/deploy/KEB/ .

Qualquer ideia / conselho de como este comportamento poderia ser explicado ou o que eu deveria estar procurando para consertar o roteiro é muito apreciado.

    
por Oliver N. 11.10.2013 / 15:45

1 resposta

2

Acho que seu problema é o uso de eval . Se você pegar seu script e usar matrizes para armazenar os comandos antes de executá-lo, isso será suficiente para executar esses comandos.

#!/bin/bash

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

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

Não é necessário executá-las por eval .

Exemplo

$ ./ascript.bash 
onecmd
ascript.bash
cmd3

Depuração

Você pode ver o que está acontecendo nos bastidores, se você ativar o modo de depuração do 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
    
por 11.10.2013 / 16:31