[function] 셸에서 함수 내보내기

부모 프로세스에서 시작된 모든 자식 프로세스에서 함수를 사용할 수 있도록 부모 셸 (bash, sh 또는 ksh)에서 함수를 내보내는 방법을 알려주세요.



답변

export -f기능은 Bash에만 해당됩니다.

부모의

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

아이

#!/bin/bash
echo $(plus1 $(($1 * $2)) )


답변

이어 sh, 그 것이다 하지 같은 기능을 내보낼 수 찰스 더피 하였음 .


답변

ksh 또는 zsh를 사용하는 경우 :

FPATH모든 함수를 배치 할 수 있는 환경 변수를 사용할 수 있습니다 .

경우는 FPATH대화 형 인터프리터에 설정되고, 명령이나 함수는 현재 쉘 환경에서 발견되지 않았거나는 PATH, 디렉토리가 누락 된 명령의 이름을 딴 파일의 존재가 검색됩니다 나열. 하나가 발견되면 현재 쉘 환경에서 소싱되며 함수를 정의 할 것으로 예상됩니다.

따라서 모든 함수를의 위치에 배치 할 수 FPATH있으며 하위 스크립트도 찾을 수 있습니다.

autoload쉘 스크립트 에서 명령을 사용하여 필요한 기능을로드 할 수 있습니다.

autoload fun_a fun_b

zsh에서 작동 autoload하려면이 필요 FPATH합니다. 에서 ksh와 그 가까운 친척 FPATH은 직접 정의한 것처럼 PATH의 일반 명령을 무시하도록 정의 된 함수를 단순히 유발한다고 생각합니다 .

FPATH및에 대한 세부 정보 autoload:


답변

를 사용하여 서브 쉘을 생성하면 ( )모든 정의, 매개 변수 및 쉘 변수의 스냅 샷을 상속합니다.

프로그램처럼 실행하면 정의를 .bashrc.

기존 스크립트를 스푸핑하여 PATH 명령에 대한 래퍼 또는 대체를 실행하려는 경우 실행 .bashrc세부 정보에 따라 작동합니다. 그렇지 않은 경우 대신 함수를 정의하는 포함 파일 .또는 source함수를 정의 하는 래퍼 스크립트를 실행 한 다음 대체 할 명령으로 셸 스크립트에 대해 동일한 작업을 수행 할 수 있습니다.

래퍼 스크립트는 다음과 같습니다.

script=$1
shift
. include.sh
. $script "$@"

아이디어는 첫 번째 매개 변수가 실제 스크립트의 이름이고 나머지 매개 변수는 args이면 위의 스크립트가 대신 실행된다는 것입니다.


답변

declare -x -f NAME

더 많은 정보

-f 기능 이름 및 정의에 대한 조치 또는 표시 제한
-x를 사용하여 NAME 내보내기


답변

기능은 본질적으로 내보낼 수 없습니다. 그러나 문자열을 내보낼 수 있으므로 여기에 약간의 트릭이 있습니다.

func="$(typeset -f funcname)"
export func

함수를 가져 오려면 내 보낸 문자열에서 다시 정의하십시오.

# in subshell
eval "$func"


답변