2009-09-18 3 views
2

bash의 스크립트에는 포함 된 라이브러리가 많이 있으며이 파일에 선언 된 함수를 사용합니다. 이와 같이 :bash에서 함수의 선언은 어디에 있습니까?

#!/bin/bash 
. foo.inc 
. bar.inc 
. baz.inc 

function_1 
function_2 
function_3 

EOF 

제 질문은 function_1 선언을 포함하는 파일을 배우는 방법입니다. 이 스크립트의 런타임에.

+2

이 왜 foo.inc, bar.inc 및 baz.inc로 보지 않는다? –

+0

새 include를 추가하려면 검색 기능에 새 코드를 추가해야합니다. –

답변

1

당신은 모른다. 당신은 정의에 포함 된 파일을 grep을해야합니다

+0

나는 포함하고 싶지 않아 ... –

+0

그런 다음 그들을 포함해서는 안됩니다. 죄송합니다. 귀하의 문제를 충분히 이해하지 못합니다. 의존하는 파일을 포함하면 – Mark

+0

새 lib를 포함 할 때 새 grep을 추가하고 싶지 않습니다 ... 유형 -t function_1이는 것을 알 수 있습니다 말할 수있는 기능 형 -f 핑 어디 이있는 내 함수가 정의 정보 파일 배울 수있는 방법이 될 수 있습니다 파일 ...? –

1

편집 :

shopt -s extdebug 

은 다음 소스 파일 이름과 라인을 검색 할 수 있습니다 스크립트에서

, 다음 줄을 추가합니다

def=($(declare -F function_1)) 
echo "function name: ${def[0]}" 
echo "line number: ${def[1]}" 
echo "file name: ${def[@]:2}" # the array slice makes it work even if the filename contains spaces 

원래 답 : 함수 정의에서 시작하는 파일 수 :

런타임에 함수를 제공하는 파일을 알 필요가 없습니다. 코드를 게시 한 경우 필요한 정보를 더 잘 볼 수 있습니다.

파일을 원본으로 만들 때 (예 : ". foo.inc"사용) 실제로 주 파일에있는 것처럼 처리됩니다.

당신이 필요로하는 경우가 장전 경우, 어떤 이유로, 알고 아직 당신이 (울고 차에 아이들에 가깝다 몇 초마다 "우리는 아직?") 추한 뭔가를 할 수 :

function_check() 
{ 
    local fn found notfound; 
    for fn in $function_list; 
    do 
     if [[ -n $(declare -F $fn) ]]; then 
      found+=$fn" "; 
     else 
      notfound+=$fn" "; 
     fi; 
    done; 
    echo $found; 
    function_list=$notfound 
} 

function_list="function_1 function_2 function_3" 

. foo.inc 
foo_list=$(function_check) 

. bar.inc 
bar_list=$(function_check) 

. baz.inc  
baz_list=$(function_check) 

echo "Warning: the following functions were not found: $function_list" 

function_check 함수는 $function_list에 나열된 함수가 있는지 확인하고 발견되면 해당 함수를 반향 출력하고 목록에서 제거합니다. (예를 들어 그렇게 빨리 세 번!)

편집 : 여기

내가 당신이 원하는 것을 매우 가까이있을 수 있습니다 무슨 생각을 할 수있는 방법이다 :

하여 각각의 기능에 추가

스크립트에서 다음
function_1() 
{ 
    if [[ $1 == "--source" ]] 
    then 
     echo "source: ${BASH_SOURCE}" 
     return 
    fi 

    # do your function stuff 
} 

, 당신은 파일이 기능을 포함 할 수있는 소스와 particula의 원인을 찾기 위해이 같은 소스를 반환하는 옵션에 대한 테스트 r 함수 :

function_1 --source 

은 원래 파일 이름을 표시합니다. 그리고 물론 당신은 그것을 행동 할 수

if [[ $(function_1 --source) == /some/dir/file ]] 
then 
    do_something 
fi 
+0

@Grokix : 나는 몇 가지 추가 정보를 추가했습니다. –

관련 문제