eval을 사용하여 bash 함수를 동적으로 정의

eval을 사용하여 bash 함수를 동적으로 정의

다음 코드를 사용하여 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_functiondispatch 를 사용하고 싶을 때마다 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단 한 줄인 경우 위의 내용을 다음과 같이 단순화할 수 있습니다.

상위 함수()
{
    기타 명령
    대리자 기능
    기타 명령
}

;추신 : 줄 끝에 사용할 필요는 없습니다 . 같은 줄에 여러 항목을 넣을 때만 구분 기호로 사용하세요.

관련 정보