zsh - 스크립트가 옵션 설정을 읽지 못하는 이유는 무엇입니까?

zsh - 스크립트가 옵션 설정을 읽지 못하는 이유는 무엇입니까?

zsh 5.8.1(x86_64-apple-darwin21.0)을 사용하면 다음에 종속됩니다.zsh 기본 배열 인덱스는 1부터 시작합니다., 이전 사용자 설정이 이를 방해하지 않는지 확인하고 싶습니다. 가장 좋은 방법은 사용자의 현재 KSH_ARRAYS설정을 저장한 다음 이 옵션을 설정 해제한 다음 완료되면 옵션을 원래 설정으로 재설정하는 것 같습니다. 나는 다음을 가지고 있습니다 :

#!/usr/bin/env zsh

if [[ -o ksharrays ]]; then
  echo "setting ksharrays_is_set to 1...";
  ksharrays_is_set=1;
else
  echo "setting ksharrays_is_set to 0...";
  ksharrays_is_set=0;
fi

unsetopt KSH_ARRAYS;

# here is where my script runs

if [[ ksharrays_is_set -eq 1 ]]; then
  echo "setting the ksharrays option...";
  setopt ksharrays;
fi

이를 테스트하기 위해 setopt ksharrays터미널에서 실행한 다음 스크립트를 실행했습니다. 그러나 setting ksharrays_is_set to 0...터미널에서는 여전히 에코가 표시됩니다.

setopt ksharrays2번째 줄(shebang 바로 아래)에 추가하면 예상한 setting ksharrays_is_set to 1...내용이 표시됩니다.setting the ksharrays option...

터미널에서 설정하면 옵션이 선택되지 않고 스크립트에서 설정하면 선택되는 이유는 무엇입니까?

편집: 또한 이 파일을 추가 setopt ksharrays하고 ~/.zshrcing ~/.zshenvsource다음 위 스크립트를 실행해 보았습니다. 이로 인해 setting ksharrays_is_set to 0...예상한 출력과 다른 결과 도 나왔습니다 . setopt인수 없이 터미널에서 명령을 실행하여 명령이 적용되는지 확인했습니다 .

$ setopt

combiningchars
interactive
ksharrays
login
monitor
promptsubst
shinstdin
zle

echo $(setopt)편집 2: 스크립트 상단에 추가했습니다 . 인쇄되는 유일한 것은 nohashdirs인수 없이 터미널에서 직접 실행할 때 이나 다른 옵션이 표시되지 않는다는 combiningcharsinteractive입니다.setopt

답변1

다른 프로그램에서 프로그램을 실행하면 각 프로그램은 그 자체가 됩니다. zsh에서 zsh를 실행한다고 해서 두 번째 zsh가 어떻게든 부모로부터 일부 설정을 상속받게 되는 것은 아닙니다.

zsh 스크립트를 작성했습니다. 따라서 를 실행하면 /path/to/your/script운영 체제는 파일이 다음으로 끝나는 것을 발견합니다.셰르본줄을 입력하고 zsh명령 검색 경로에서 실행합니다. 누가 프로세스를 시작했는지는 중요하지 않습니다. zsh의 새 인스턴스는 기본 설정으로 시작됩니다. 설정에 대한 모든 변경 사항(예: zsh 옵션)은 명령줄이나 구성 파일 또는 스크립트의 내용과 같은 곳에서 이루어져야 합니다.

일부 설정은 한 프로그램이 다른 프로그램을 호출할 때 상속되지만 이는 zsh뿐만 아니라 모든 프로그램에 적용되는 설정입니다. 주로,환경 변수유전적이에요. Zsh는 환경 변수를 기반으로 옵션을 설정하지 않습니다.

당신이 사용하는 경우.또는 source내장zsh에서. 이는 .명령이 포함된 파일 에 작성된 것처럼 파일에서 명령을 읽도록 zsh에 지시합니다 . 안타깝게도 이 두 가지 상황을 구별할 수 있는 명확한 용어가 없습니다. 둘 다 "스크립트"라고 합니다. 스크립트는 실행( /path/to/script모든 프로그램에서 실행)되거나 소스로 제공( . /path/to/scriptzsh에서 실행)될 수 있습니다. 동일한 파일을 어느 방향으로든 사용할 수 있지만 대부분의 스크립트는 한 방향으로만 사용할 수 있습니다. 귀하의 스크립트는 실행될 독립형 프로그램입니다.

zsh가 실행 스크립트 실행을 시작할 때 어떤 일이 발생하는지 살펴보겠습니다. zsh가 스크립트를 실행할 때 로드되지는 않지만 .zshrc(zsh 대화형 런타임에만 해당) 로드됩니다./etc/zshenv그리고~/.zshenv. 를 입력하면 setopt ksh_arrays스크립트가 해당 설정을 채택합니다. 어떤 setopt명령(또는 거의 모든 명령)을 입력하는 것은 .zshenv좋지 않은 생각이며 스크립트가 중단됩니다.

스크립트가 종료되면 아무도 어떤 zsh 옵션을 활성화했는지 신경쓰거나 기억하지 않습니다. 따라서 ksh_arrays스크립트의 모든 코드를 활성화하려면 setopt ksh_arrays스토리의 끝 부분인 스크립트 시작 부분에서 실행하면 됩니다.

코드의 일부에만 특정 옵션이 필요한 경우 해당 부분을 함수에 넣고 설정하십시오.local_options기능의 옵션. 예를 들어, ksh_arrays함수가 실행될 때 활성화하고 종료 시 기본 설정을 복원 하려면 setopt local_options ksh_array함수 상단 근처에 배치합니다. 또한 일부 옵션을 변경해야 하는 코드는 다른 옵션의 기본값이 변경되면 중단되는 경우가 많습니다. 따라서 옵션이 기본값에서 변경되었을 수 있는 컨텍스트에서 zsh 코드를 실행해야 하는 경우 해당 코드를 함수에 넣고 실행하십시오.emulate -LR zsh그 기능에서. 이렇게 하면 기능이 기본 옵션으로 실행되고 local_options활성화되므로 기능이 종료되면 옵션에 대한 변경 사항이 취소됩니다. 일부 코드는 특정 "최종 사용자" 옵션을 따라야 합니다. 예를 들어, mark_dirs이러한 코드의 경우 emulate -L zsh(예: 제거 -R) 옵션을 사용하십시오. 예를 들어 완성 함수의 경우에도 마찬가지입니다.

관련 정보