Bash에서 함수를 "내보낼" 수 있나요?

Bash에서 함수를 "내보낼" 수 있나요?
source some_file

일부_파일:

doit ()
{
  echo doit $1
}
export TEST=true

내가 출처라면일부 파일"doit" 함수와 TEST 변수는 명령줄에서 사용할 수 있습니다. 하지만 다음 스크립트를 실행하세요.

스크립트.sh:

#/bin/sh
echo $TEST
doit test2

TEST 값이 반환되지만 알 수 없는 함수 "doit"에 대한 오류가 발생합니다.

함수도 "내보낼" 수 있습니까? 아니면 거기에서 함수를 사용하려면 script.sh에서 some_file을 가져와야 합니까?

답변1

Bash에서는 스크립트가 호출하는 다른 쉘 스크립트로 함수 정의를 내보낼 수 있습니다.

export -f function_name

예를 들어 다음과 같은 간단한 예를 시도해 볼 수 있습니다.

./script1:

#!/bin/bash

myfun() {
    echo "Hello!"
}

export -f myfun
./script2

./script2:

#!/bin/bash

myfun

그런 다음 전화하면 ./script1출력이 표시됩니다.안녕하세요!.

답변2

"내보내기" 함수를 사용하면 export -f함수 본문이 포함된 환경 변수가 생성됩니다. 다음 예를 고려하십시오.

$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() {  echo \'\"\ \ \$
}

즉, 쉘(Bash만?)만이 이 기능을 허용할 수 있습니다. Bash는 () {as 함수로 시작하는 환경 변수 만 고려하므로 함수를 직접 설정할 수도 있습니다 .

$ fn2='() { echo Hi;}' sh -c fn2
Hi
$ fn3='() {' sh -c :
sh: fn3: line 1: syntax error: unexpected end of file
sh: error importing function definition for `fn3'

SSH를 통해 이 변수를 "내보내려면" 함수가 문자열로 필요합니다. -p내장 함수( )의 인쇄 옵션( )을 통해 이 작업을 수행할 수 있습니다 -f.declare

$ declare -pf fn
fn () 
{ 
    echo \'\"\ \ \$
}

이는 SSH를 통해 실행해야 하는 더 복잡한 코드가 있는 경우 유용합니다. 다음 가상 스크립트를 고려해보세요.

#!/bin/bash
remote_main() {
   local dest="$HOME/destination"

   tar xzv -C "$dest"
   chgrp -R www-data "$dest"
   # Ensure that newly written files have the 'www-data' group too
   find "$dest" -type d -exec chmod g+s {} \;
}
tar cz files/ | ssh user@host "$(declare -pf remote_main); remote_main"

답변3

확립된@Lekenstein의 답변...

를 사용하면 declare -pf현재 셸에서 이전에 정의된 모든 함수가 STDOUT으로 출력됩니다.

이 시점에서 STDOUT을 원하는 곳으로 리디렉션하고 실제로 원하는 곳에 이전에 정의된 함수를 채울 수 있습니다.

아래 답변은 이를 변수에 채웁니다. 그런 다음 해당 변수와 새 사용자로 생성된 새 셸에서 실행하려는 함수에 대한 호출을 에코합니다. (일명 ) sudo스위치를 사용하고 Bash를 실행하면 됩니다(파이프된 STDOUT을 실행 입력으로 수신함).-uuser

우리는 Bash 쉘에서 Bash 쉘로 이동한다는 것을 알고 있으므로 Bash가 이전 쉘에서 정의한 기능을 올바르게 해석할 것이라는 것을 알고 있습니다. 동일한 버전의 Bash 셸에서 동일한 버전의 새 Bash 셸 사이를 이동하는 한 구문은 문제가 없습니다.

서로 다른 쉘 간 또는 서로 다른 버전의 Bash가 있을 수 있는 시스템 간에 이동하는 경우 YMMV.

#!/bin/bash
foo() {
  echo "hello from `whoami`"
}

FUNCTIONS=`declare -pf`; echo "$FUNCTIONS ; foo" | sudo -u otheruser bash
# $./test.sh
# hello from otheruser

답변4

eval "$(declare -F | sed -e 's/-f /-fx /')"수출할 것이다모두기능.

나는 함수와 변수를 사용하는 동안 스크립트의 컨텍스트에서 디버깅하고 작업할 수 있도록 스크립트에서 대화형 셸을 시작하기 전에 종종 이 작업을 수행합니다.

예:

eval "$(declare -F | sed -e 's/-f /-fx /')"
export SOME IMPORTANT VARIABLES AND PASSWORDS
bash -i

관련 정보