다음 코드를 사용하여 bash 함수를 동적으로 정의하려고 합니다.
delegate_function() { echo "output from delegate"; }
eval "parent_function() { echo $(delegate_function); }"
목적은 실행 시 부모 함수가 대리자에게 동적으로 전달되도록 하는 것입니다. 그러나 eval
작동 방식으로 인해 내 기능은 다음과 같이 정의됩니다.
kshitiz:/tmp$ type parent_function
parent_function is a function
parent_function ()
{
echo output from delegate
}
정의를 다음과 같이 변경하려면 어떻게 해야 합니까?
parent_function ()
{
echo $(delegate_function);
}
평가되는 문자열의 특정 부분을 방지하는 방법이 있습니까 eval
?
답변1
Bash에서는 대부분의 언어와 마찬가지로 eval
이를 피해야 합니다. 예를 들어 Greg의 FAQ를 참조하세요.평가 명령 및 보안 문제
parent_function
다음과 같이 정의 할 수 있습니다 .
parent_function=delegate_function
parent_function
dispatch 를 사용하고 싶을 때마다 delegate_function
다음을 실행하세요:
$ $parent_function
output from delegate
동적 기능 업데이트 예
정의 delegate_function
하고 parent_function
실행 해 봅시다 $parent_function
:
$ delegate_function() { echo "delegate version 1"; }
$ parent_function=delegate_function
$ $parent_function
delegate version 1
delegate_function
이제 변경 하고 다시 실행 해 보겠습니다 $parent_function
.
$ delegate_function() { echo "delegate version 2"; }
$ $parent_function
delegate version 2
$parent_function
새로운 버전의 Delegate_function을 실행하려면 지금 업데이트하세요.
이름을 동적으로 선택하는 예
대리자 함수를 만들어 보겠습니다.
$ delegate_function() { echo "delegate function executed"; }
몇 가지 이름을 지정해 보겠습니다.
$ parent_function=some_name
이제 이 이름의 동적 할당을 살펴보겠습니다.
$ typeset $parent_function=delegate_function
$ $some_name
delegate function executed
답변2
$
이 작업을 수행하려면 이스케이프 만으로 충분해야 합니다.
eval "parent_function() { echo \$(delegate_function); }"
답변3
예를 들어, 다른 항목과 함께 parent_function
생성된 출력을 원하는 경우delegate_function
상위 함수() { 기타 명령 echo$(위임 기능) 기타 명령 }
음, 출력이 delegate_function
단 한 줄인 경우 위의 내용을 다음과 같이 단순화할 수 있습니다.
상위 함수() { 기타 명령 대리자 기능 기타 명령 }
;
추신 : 줄 끝에 사용할 필요는 없습니다 . 같은 줄에 여러 항목을 넣을 때만 구분 기호로 사용하세요.