부모 프로세스에서 시작된 모든 자식 프로세스에서 함수를 사용할 수 있도록 부모 셸 (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"