2017-12-30 9 views
-1

원래 문자열 변수에서 오는 중괄호 확장을 확장하려면 어떻게합니까? 문자열 변수는 필수 항목입니다.문자열에서 BASH 중괄호 확장

#!/usr/bin/env bash 

TEXT_DIRS='opt/*/{doc,gtk-doc}' 

내 의도는 zsh 또는 다른 언어 (예 : Perl 또는 Python)에서 bash 소스를 읽는 것입니다. 아래와 같이 /etc/makepkg.conf에서 구성을 가져옵니다.

DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) 

학습 목적으로 만 해당됩니다. 문자열에서 확장 할 수 있습니까?

답변

1

까다로운 점은 Bash가 환경 변수를 해결하면 다시 내용을 처리하기위한 다른 단계를 수행하지 않는다는 것입니다. 변수의 내용을 에 또 다른 (예 : 다른 쉘 명령)으로 평가해야합니다. 여기

bash-4.4# TEXT_DIRS='/usr/*/{bin,src,lib}' 
bash-4.4# bash -c ls\ $TEXT_DIRS 
ls: /usr/*/src: No such file or directory 
/usr/local/bin: 

/usr/local/lib: 

, 나는 동적으로 그때 eval uate은 제 2 확장을 처리하는 쉘 명령을 생성하고 있습니다 :

는 여기에 한 가지 방법입니다. (필자는 경로를 일반적인 시스템에서 일치하는 것으로 변경 했으므로 테스트를 시도하면 다시 변경해야합니다.)

코드를 동적으로 생성하는 것은 입력을 신뢰할 수없는 경우 항상 위험합니다. 그것은 본질적으로 명령 주입 공격이 작동하는 방식입니다. 하지만 신뢰할 수있는 입력을 사용하여 자신의 셸에서 eval을 사용하면 다소 "안전"하지만 나 자신과 같은 인위적인 시나리오 나 내 자신의 더 나쁜 아이디어가 아니라면 거의 사용하지 않습니다.

+0

우수 답변 선생님. 정확히 내가 필요한 것. 이제 zsh에서 bash 행을 구문 분석 할 수 있습니다. 이것은 내 첫 번째 게시물 stackoverflow, 내 akwardness 용서에 대한 논평이다. –

+0

당신은 당신이 생각하고 시도한 것을 잘 설명해주었습니다. 그래서 첫 번째로 큰 질문이었습니다. 이 시점에서 많은 질문들이 중복되므로 귀하의 질문에 너무 실망하지 마십시오. –