셸에서 함수 내보내기


답변:


105

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

부모의

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

아이

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

2
내보내기 기능은 하위 통화에만 사용할 수 있습니까? 현재 bash 세션에 적용하는 방법은 무엇입니까? .bashrc 작성을 좋아하지만 현재 bash 인스턴스에만 해당됩니다 ...
vp_arth

3
@vp_arth : 자식 호출에 함수가 필요하지 않은 경우 내보낼 필요가 없습니다. 현재 세션에서 어떤 방식 으로든 사용할 수 있습니다 (파일에 정의되어있는 경우 현재 세션에서 사용할 수 있도록 파일을 실행하는 대신 소스를 지정해야합니다).
추후 공지가있을 때까지 일시 중지되었습니다.


3

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

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

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

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

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

autoload fun_a fun_b

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

FPATH및에 대한 세부 정보 autoload:


1

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

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

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

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

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

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


2
코딩 예를 들어 설명해 주시겠습니까? 나는 .bashrc에 내 기능을 넣어 싶지 않다
Sachin Chourasiya에게

1
declare -x -f NAME

더 많은 정보

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

6
이 대상이므로주의 해주십시오 특정가bash . ( ksh의 대응하는은 declare, typeset, 갖는다 -x옵션이지만에만 적용되는 변수 , 동을 위해 기능하지 zsh).
mklement0 2014

0

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

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

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

# in subshell
eval "$func"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.