편집하다

편집하다

우분투에서 몇 가지 스크립트를 만들었습니다. Kali와 Debian에서 이를 사용했을 때 서식이 eval지정된 텍스트 파일에서 데이터를 추출하는 데 사용한 명령이 제대로 작동하지 않는다는 것을 발견했습니다. 데비안 기반 시스템에서 작동시키는 방법을 아는 사람이 있나요?

어떻게 사용하나요? eval(작은 예)

#!/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#

이것은 우분투에서 이 스크립트의 출력입니다.

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

정보

문제를 단순화하려고 했을 때 나는 문제를 해결하고 있었습니다.칼리 리눅스chroot 환경을 통해!

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:/# 

이렇게 도움을 주신 편집자님께 감사드리며, 여기에 적어주신 모든 내용에 감사드립니다!

답변1

편집하다

사용자는 자신의 질문을 광범위하게 변경했으며 이 답변은 사용자가 게시한 코드를 편집한 것이며 이제 더 이상 질문에 포함되지 않습니다.

새로운 코드가 있고 질문이 다른 것으로 변경되었습니다.

따라서 이 답변은 오래된(그리고 유효하지 않은) 코드로 간주되어야 합니다.

원래

귀하의 코드를 올바르게 이해한다면.
코드에서 두 변수의 값을 가져오기 위해 eval을 사용합니다.
이는 "나쁜 습관"으로 간주됩니다.

소스 파일을 다음과 같이 변경하는 경우:

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

도착하다

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

또는 이 문서에 한 쌍의 값을 삽입하더라도 이 코드는 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_

배열 LINK가 정말로 필요한 경우 다음을 수행하십시오.

LINK=($SCR $DST)

mv 및 LINKIT에서 SRC 및 DST의 var 확장을 참조하고 LINKIT를 $LINKIT로 변경했습니다(이것은 함수가 아니라 변수라고 가정합니다. 필요한 경우 다시 변경합니다).

관련 정보