IT박스

셸에서 함수 내보내기

itboxs 2020. 9. 17. 07:25
반응형

셸에서 함수 내보내기


부모 셸 (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"

참고 URL : https://stackoverflow.com/questions/1885871/exporting-a-function-in-shell

반응형