bash의 내보내기 -f에 해당하는 zsh는 무엇입니까?

bash의 내보내기 -f에 해당하는 zsh는 무엇입니까?

그래서 나는 그것을 사용하기 시작했습니다 zsh. 나는 그것을 모두 좋아했습니다. 매우 멋지고 매끄럽게 보이며 현재 작업 디렉터리와 실제 명령줄이 다른 줄에 있다는 사실이 좋지만 동시에 zsh조금 느려질 수 있다는 사실도 발견했습니다 bash. 특히 텍스트를 인쇄할 때 더욱 그렇습니다. 화면.

내가 가장 좋아하는 점은 zsh나와 함께 작동한다는 것입니다 .bashrc.

그래도 불만이 하나 있습니다. 모든 것이 잘 작동하지만 내보내기 시스템이 어떻게 작동하는지 모르겠습니다.

..bashrcexport -f

zsh에서는 내보내기에 대해 언급조차 하지 않는 것 같습니다. 자동으로 로드되나요? 이 두 가지가 같은 것인가요? 나는 이것을 알아내는 데 어려움을 겪고 있습니다.

답변1

함수를 포함하는 환경 변수는 bash 해킹입니다. 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의 최초 발견자는 함수 정의가 잘못된 경우 이 답변의 이전 버전이 이 시점에서 잠재적으로 임의의 코드를 실행할 수 있음을 지적했습니다. 이 버전은 그렇지 않지만, 물론 명령을 실행하면 환경에서 가져온 함수일 수 있습니다. )

Shellshock 이후 버전의 bash BASH_FUNC_myfunc%%인코딩 기능은 잘못된 변수 이름(예:)이 있는 환경에서 수행됩니다. zsh는 환경에서 이러한 변수 이름을 추출하는 인터페이스를 제공하지 않기 때문에 이로 인해 안정적으로 구문 분석하기가 더 어려워집니다.

나는 이것을 권장하지 않습니다. 스크립트에서 내보낸 함수에 의존하는 것은 나쁜 생각입니다. 스크립트에 보이지 않는 종속성을 생성합니다. 기능이 없는 환경(다른 컴퓨터, 크론 작업, 쉘 초기화 파일 변경 후...)에서 스크립트를 실행하면 스크립트가 더 이상 작동하지 않습니다. 대신 모든 함수를 하나 이상의 별도 파일( 과 유사 ~/lib/shell/foo.sh)에 저장하고 스크립트에서 사용하는 함수를 가져와서 스크립트를 시작하세요( . ~/lib/shell/foo.sh). 이렇게 하면 수정하면 foo.sh어떤 스크립트가 이에 의존하는지 쉽게 검색할 수 있습니다. 스크립트를 복사하면 필요한 보조 파일을 쉽게 찾을 수 있습니다.

Zsh(및 그 이전의 ksh)는 이를 사용하는 스크립트에서 함수를 자동으로 로드하는 방법을 제공하여 이를 더욱 편리하게 만듭니다. 제한 사항은 파일당 하나의 기능만 배치할 수 있다는 것입니다. 함수를 자동 로드됨으로 선언하고 function_name이라는 파일에 함수 정의를 저장합니다. 이 파일을 나열된 디렉터리에 배치합니다 $fpath( FPATH환경 변수를 통해 구성할 수 있음). 스크립트에서 autoload -U foo.

또한 zsh는 스크립트를 컴파일하여 구문 분석 시간을 절약할 수 있습니다. 부르다zcompile스크립트를 컴파일합니다. 확장자를 가진 파일이 생성됩니다 .zwc. 이 파일이 있으면 autoload소스 코드 대신 컴파일된 파일이 로드됩니다. 당신은 그것을 사용할 수 있습니다zrecompile기능디렉토리의 모든 함수 정의를 (재)컴파일합니다.

답변2

함수 선언을 넣으면.zshenv, 아무런 노력 없이 스크립트에서 함수를 사용할 수 있습니다.

답변3

내가 읽은 모든 내용은 자동으로 함수를 가져오는 것이 나쁜 생각이라는 것을 암시하므로 스크립트를 서브셸에서 쉽게 액세스할 수 있는 별도의 파일로 추출하기로 결정했습니다.

공유 파일을 호출했습니다 .zshared.

# ~/.zshared
function say-hello() {
  echo "Hello, $1\!"
}

내 에서 출처를 밝히겠습니다 .zshrc.

# ~/.zshrc
source ~/.zshared

이러한 기능에 액세스해야 하는 스크립트에서는 .zshared.

#!/usr/bin/env zsh
source ~/.zshared

say-hello "David" # Hello, David!

처음에 스크립트를 업데이트하려면 약간의 작업이 필요하지만 큰 오버헤드 없이 한 곳에서 함수를 정의할 수 있습니다.

관련 정보