'eval' funciona no Ubuntu, mas não funciona no Debian e Kali [fechado]

0

Eu tenho alguns scripts criados no Ubuntu. Quando eu os uso no Kali e no Debian, Descobri que o comando eval que uso para extrair os dados de arquivos de texto formatados não funciona bem. Alguém sabe como fazê-lo funcionar nesses sistemas baseados em Debian?

Como usei eval (pequeno exemplo)

#!/bin/bash
basename=$(basename $0)
dirname=$(dirname $0)
if [[ $EUID -gt 0 ]];
then
    exec sudo "$dirname/$basename" "$@"
fi
myscript=$dirname/$basename
function getlistof () {
    awk "/^#BEGIN-$1#/, /^#END-$1#/" $myscript | grep -v '#BEGIN\|#END' | grep "$2"
}
getlistof log mylink | while read mylink # here mylink='mylink=(source=... destn=....) (var)'
    do
        eval "$mylink" # and here should become mylink='(source=... destn=....)(array)'
        eval "${mylink[*]}" # and here the script should know about vars inside the array!
        echo " $source $destn"
    done
exit
#BEGIN-log#
mylink=(source=sources_one destn=destn_one)
mylink=(source=source_two destn=destn_two)
#END-log#

Aqui está a saída deste script no Ubuntu

 younes@unix:~$ ./myscript
 sources_one destn_one
 source_two destn_two

Notícias

e enquanto eu estou tentando simplificar a pergunta eu consegui trabalhar em kali-linux através do chroot env!

younes@unix:~$ lsb_release -srci
Ubuntu
15.04
vivid
younes@unix:~$ ./myscript
 sources_one destn_one
 source_two destn_two
younes@unix:~$ sudo cp -f myscript /.Kali-2.0-sana/home/younes/
younes@unix:~$ chroothere /.Kali-2.0-sana
root@unix:/# lsb_release -srci
Kali
2.0
sana
root@unix:/# /home/younes/myscript 
 sources_one destn_one
 source_two destn_two
root@unix:/# 

do que os editores, ajudantes de professores, para cada byte que você escreveu aqui!

    
por Jonas 25.10.2015 / 23:36

1 resposta

2

EDITAR

O usuário alterou extensivamente sua pergunta, essa resposta foi uma edição do código que o usuário postou e que não existe mais em sua pergunta agora.

Existe um novo código e a questão mudou para outra coisa.

Como tal, esta resposta deve ser considerada como código antigo (e inválido).

Original

Se eu estou entendendo seu código corretamente.
Você está usando o eval apenas para obter o valor de dois vars dentro do seu código.
Isso é visto como "má prática".

Se você alterar seu arquivo de origem de:

LINK=(SRC=/.hd/home/younes/.conky DST=/home/younes/.conky)

para

/.hd/home/younes/.conky /home/younes/.conky

ou mesmo se você inserir o par de valores em um documento aqui, esse código fará a mesma coisa sem eval:

while read SRC DST
do
    [[ ! -e $SRC ]] && [[ ! -e $DST ]] && echo "oOpsS! $DST" && exit
    [[ ! -e $SRC ]] &&  mv "$DST" "$SRC"
    [[ ! -e $DST ]] &&  $LINKIT "$SRC" "$DST"
    ls -l "$DST" | grep "$SRC" &>/dev/null || $LINKIT "$SRC" "$DST"
done <<\_list_of_dir_pairs_
/.hd/home/younes/.conky             /home/younes/.conky
/.hd/home/younes/.fonts             /home/younes/.fonts
/.hd/home/younes/.thumbnails        /home/younes/.thumbnails
/.hd/home/younes/.xbindkeys         /home/younes/.xbindkeys
/.hd/home/younes/.xbindkeys_config  /home/younes/.xbindkeys_config
/.hd/home/younes/.xbindkeysrc       /home/younes/.xbindkeysrc
_list_of_dir_pairs_

E, se você precisar da matriz LINK, faça:

LINK=($SCR $DST)

Note que eu citei as expansões var de SRC e DST em mv e LINKIT, e mudei LINKIT para $ LINKIT (estou assumindo que é uma variável, e não uma função. Troque de volta se você precisar).

    
por 26.10.2015 / 02:35