우분투에서 몇 가지 스크립트를 만들었습니다. 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로 변경했습니다(이것은 함수가 아니라 변수라고 가정합니다. 필요한 경우 다시 변경합니다).