다른 스크립트에서 스크립트의 일부만 가져오시겠습니까?

다른 스크립트에서 스크립트의 일부만 가져오시겠습니까?

이것은 아마도 문제를 해결하는 최선의 방법은 아니지만 가능한지 알고 싶습니다.

그것은 다음과 같습니다:

awk '/function_i_want_to_call/,/^$/{print}' script_containing_function | xargs source

function_i_want_to_call arg1 arg2 arg3

실제 작업을 제외하고.

답변1

먼저, 조달하려는 특정 부품을 생산하는 명령을 엄격하게 결정해야 합니다. 간단한 예를 들자면 파일이 주어졌을 때

var1=value1
var2=value2

원하는 경우 에만 var1사용할 수 있습니다. 이는 임의로 복잡한 파이프라인이 될 수 있습니다.head -n1 filename

그런 다음 다음을 실행하십시오.

source <( pipeline_of_arbitrary_complexity some_filename )

에서만 사용할 수 있습니다 bash. POSIX에서 이를 수행하려면 임시 파일을 만들어야 할 것 같습니다.

답변2

bash/ksh 및 이와 유사한 경우 다음을 사용하여 <()하위 쉘을 생성하는 것을 피할 수 있습니다 |.

explorer.sh:

echo hallo welt
echo hello world
echo ahoj světe

소스 코드에 두 번째 줄만 넣고 싶다고 가정해 보겠습니다.

. <( sed -n '2 p' < insourcable.sh )

("Hello World" 인쇄)

답변3

dotfn(){ . /dev/fd/0
} <<IN
        $(printf '\n%s(){ "$@" '"'\n" "$2"
          sed   -e"/$2.*{/,\$!d;s/^/    /"\
                -e"/^. *} *$/q;s/'/'"'\\&&/g'  <"$1"
          printf "\n';}")
IN

분명히 이것은 완벽하지는 않지만 두 번째 인수로 시작하는 첫 번째 입력 세트에 대해 첫 번째 인수에 이름이 지정된 파일을 검색하고 같은 줄의 어느 지점에서 a를 따르고 {공백만 일치할 때까지 모든 후속 줄을 가져옵니다. 그리고 하나의 }.

while이 sed이를 수행하면 입력의 모든 큰 따옴표를 이스케이프하고 printf앞에 문자열이 추가된 두 개의 큰 따옴표로 입력을 래핑합니다 "$@". 두 번째 인수의 이름을 딴 함수에 이 모든 것이 포함됩니다. 예는 다음과 같습니다.

printf '
some_fn(){
        echo some stuff
        cat </dev/null
}

another_fn(){
        for f in file*; do printf '\''%s\n'\'' "$f"; done
}
' >fn_file

이 두 가지 기능을 넣었어요fn_file, 그런 다음...

dotfn fn_file another_fn

...아무 일도하지. 하지만...

another_fn printf %s\\n

another_fn(){
    for f in file*; do printf '%s\n' "$f"; done
}

함수를 자신의 이름을 딴 함수로 래핑하거나, printf다른 방법을 사용하여 검사하거나, 재정의할 수 있습니다.

another_fn eval; another_fn

file
file1.tsv
file1.txt
file2.tsv
file2.txt
filea.xyz
fileb.xyz

나는 . /dev/fd/0간단한 것으로 교체하고 계속했습니다.dotfn()catsome_fn()

dotfn fn_file some_fn

some_fn(){ "$@" '
    some_fn(){
        echo some stuff
        cat </dev/null
    }

';}

관련 정보