함수를 포함하는 환경 변수는 bash hack입니다. Zsh에는 비슷한 것이 없습니다. 몇 줄의 코드로 비슷한 것을 할 수 있습니다. 환경 변수에는 문자열이 포함됩니다. 쉘 쇼크 가 발견 되기 전에 bash의 이전 버전은 함수의 이름이 함수의 이름이고 그 () {
뒤에 값이 오는 함수의 코드 가 뒤에 오는 변수에 함수의 코드를 저장 했습니다 }
. 다음 코드를 사용하여이 인코딩으로 변수를 가져오고 bash와 같은 설정으로 변수를 실행할 수 있습니다. zsh가 모든 bash 기능을 에뮬레이트 할 수는 없습니다. 조금 더 가까이 다가 가면됩니다 (예 : $foo
값 을 나누고 와일드 카드를 확장하고 배열을 0 기반으로 만들기).
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
( Shellshock의 최초 발견자인 Stéphane Chazelas 는이 함수의 이전 버전은 함수 정의가 잘못된 경우이 시점에서 임의의 코드를 실행할 수 있다고 지적했다. 환경에서 가져온 함수일 수 있습니다.)
bash의 셸 쇼크 이후 버전의 bash는 잘못된 변수 이름 (예 :)을 사용하여 환경에서 함수를 인코딩합니다 BASH_FUNC_myfunc%%
. zsh는 환경에서 이러한 변수 이름을 추출하는 인터페이스를 제공하지 않기 때문에 안정적으로 구문 분석하기가 더 어려워집니다.
나는 이것을하지 않는 것이 좋습니다. 스크립트에서 내 보낸 함수에 의존하는 것은 나쁜 생각입니다. 스크립트에서 보이지 않는 의존성을 만듭니다. 기능이없는 환경 (쉘 초기화 파일을 변경 한 후 다른 컴퓨터, cron 작업 등)에서 스크립트를 실행하면 스크립트가 더 이상 작동하지 않습니다. 대신 모든 기능을 하나 이상의 별도 파일 (같은 것 ~/lib/shell/foo.sh
)에 저장하고 사용하는 기능 ( . ~/lib/shell/foo.sh
) 을 가져 와서 스크립트를 시작하십시오 . 이런 식으로 수정 foo.sh
하면에 의존하고있는 스크립트를 쉽게 검색 할 수 있습니다. 스크립트를 복사하면 필요한 보조 파일을 쉽게 찾을 수 있습니다.
Zsh (및 그 전에 ksh)는 함수가 사용되는 스크립트에서 함수를 자동으로로드하는 방법을 제공하여보다 편리합니다. 제약 조건은 파일 당 하나의 함수 만 넣을 수 있다는 것입니다. 함수를 자동로드 된 것으로 선언하고 이름이 함수 이름 인 파일에 함수 정의를 넣으십시오. 이 파일을 $fpath
( FPATH
환경 변수를 통해 구성 할 수있는)에 나열된 디렉토리에 넣으십시오 . 스크립트에서로 자동로드 된 함수를 선언하십시오 autoload -U foo
.
또한 zsh는 스크립트를 컴파일하여 구문 분석 시간을 절약 할 수 있습니다. zcompile
스크립트를 컴파일하기 위해 호출 합니다. .zwc
확장명을 가진 파일을 만듭니다 . 이 파일이 있으면 autoload
소스 코드 대신 컴파일 된 파일을로드합니다. zrecompile
함수 를 사용하여 디렉토리의 모든 함수 정의를 (재) 컴파일 할 수 있습니다 .