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 ksharrays
2번째 줄(shebang 바로 아래)에 추가하면 예상한 setting ksharrays_is_set to 1...
내용이 표시됩니다.setting the ksharrays option...
터미널에서 설정하면 옵션이 선택되지 않고 스크립트에서 설정하면 선택되는 이유는 무엇입니까?
편집: 또한 이 파일을 추가 setopt ksharrays
하고 ~/.zshrc
ing ~/.zshenv
한 source
다음 위 스크립트를 실행해 보았습니다. 이로 인해 setting ksharrays_is_set to 0...
예상한 출력과 다른 결과 도 나왔습니다 . setopt
인수 없이 터미널에서 명령을 실행하여 명령이 적용되는지 확인했습니다 .
$ setopt
combiningchars
interactive
ksharrays
login
monitor
promptsubst
shinstdin
zle
echo $(setopt)
편집 2: 스크립트 상단에 추가했습니다 . 인쇄되는 유일한 것은 nohashdirs
인수 없이 터미널에서 직접 실행할 때 이나 다른 옵션이 표시되지 않는다는 combiningchars
것 interactive
입니다.setopt
답변1
다른 프로그램에서 프로그램을 실행하면 각 프로그램은 그 자체가 됩니다. zsh에서 zsh를 실행한다고 해서 두 번째 zsh가 어떻게든 부모로부터 일부 설정을 상속받게 되는 것은 아닙니다.
zsh 스크립트를 작성했습니다. 따라서 를 실행하면 /path/to/your/script
운영 체제는 파일이 다음으로 끝나는 것을 발견합니다.셰르본줄을 입력하고 zsh
명령 검색 경로에서 실행합니다. 누가 프로세스를 시작했는지는 중요하지 않습니다. zsh의 새 인스턴스는 기본 설정으로 시작됩니다. 설정에 대한 모든 변경 사항(예: zsh 옵션)은 명령줄이나 구성 파일 또는 스크립트의 내용과 같은 곳에서 이루어져야 합니다.
일부 설정은 한 프로그램이 다른 프로그램을 호출할 때 상속되지만 이는 zsh뿐만 아니라 모든 프로그램에 적용되는 설정입니다. 주로,환경 변수유전적이에요. Zsh는 환경 변수를 기반으로 옵션을 설정하지 않습니다.
당신이 사용하는 경우.
또는 source
내장zsh에서. 이는 .
명령이 포함된 파일 에 작성된 것처럼 파일에서 명령을 읽도록 zsh에 지시합니다 . 안타깝게도 이 두 가지 상황을 구별할 수 있는 명확한 용어가 없습니다. 둘 다 "스크립트"라고 합니다. 스크립트는 실행( /path/to/script
모든 프로그램에서 실행)되거나 소스로 제공( . /path/to/script
zsh에서 실행)될 수 있습니다. 동일한 파일을 어느 방향으로든 사용할 수 있지만 대부분의 스크립트는 한 방향으로만 사용할 수 있습니다. 귀하의 스크립트는 실행될 독립형 프로그램입니다.
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
) 옵션을 사용하십시오. 예를 들어 완성 함수의 경우에도 마찬가지입니다.