zsh의 -i 옵션은 실제로 무엇을 수행합니까?

zsh의 -i 옵션은 실제로 무엇을 수행합니까?

zsh매뉴얼 페이지 에서 :

   -c     Take the first argument as a command to execute, rather than reading commands  from  a  script  or  standard
          input.   If  any  further  arguments are given, the first one is assigned to $0, rather than being used as a
          positional parameter.

   -i     Force shell to be interactive.  It is still possible to specify a script to execute.

   -s     Force shell to read commands from the standard input.  If the -s flag is not  present  and  an  argument  is
          given, the first argument is taken to be the pathname of a script to execute.

내가 아는 한, 소스를 강제로 사용하기 위해 와 함께 사용하지 않는 한 효과가 없습니다 -i. 그렇지 않은 경우 기본적으로 대화형인 것 같습니다.-czsh~/.zshrc-czsh

그래서:

  • zsh와 사이에 차이가 있나요 zsh -i?
  • zsh -s와 사이에 차이가 있나요 zsh -s -i?
  • -i당신이 거기 없었다면 -c어떻게 하시겠습니까 ?

답변1

여기서 혼란은 인간이 된다는 것이 무엇을 의미하는지에 대한 오해에서 비롯됩니다.인터렉티브껍데기.

AZ 셸은 프롬프트-읽기-실행 루프를 실행하기 때문에 대화형이 아닙니다. 하나는 껍질을 가질 수 있고,아니요파일이나 파이프에서 명령을 읽는 프롬프트-읽기-실행 루프를 대화형으로 실행합니다. cat | zsh정확히.

AZ 셸에 실행할 명령이나 스크립트가 없으면 대화형입니다(즉, 프롬프트-읽기-실행 루프에 들어갑니다).그리고표준 입력은 터미널입니다. 이는 쉘 프로그램이 시작 시 내리는 결정입니다. 많은 것들이체하는결정은결과어떤 시작 파일을 처리할지,초기의$-쉘 변수와 쉘 옵션의 값 interactive. "대화형 셸에서" 발생하는 모든 다양한 작업에 대해서는 설명서를 참조하세요.

다른 쉘에서 사용되는 정확한 규칙에는 매우 미묘한 차이가 있습니다. 일부(여기서 Z 쉘과 같은)는 터미널인지 확인하기 위해 표준 입력만 테스트합니다. 단일 UNIX 사양에는 표준 입력과 표준 오류를 확인해야 한다고 명시되어 있습니다. zsh 2>&1 | cat대화형 Z 쉘을 생성하지만 ksh 2>&1 | cat비대화형 Korn 쉘을 생성합니다.

Z 쉘반품프롬프트-읽기-실행 루프를 입력할지, 명령을 실행할지 또는 스크립트를 실행할지 결정합니다. 이것은분리결정, 그 결과는 am-I-상호작용 결정으로 다시 피드백됩니다. 세 가지 옵션을 모두 사용할 수 있습니다.이 옵션을 사용하면 대화형 또는 비대화형이 될 수 있습니다 -i.

-i옵션은 쉘이 대화형이라고 생각하도록 강제하는 방법일 뿐입니다.~ 일지라도표준 입력은 터미널이 아니거나 실행할 명령이나 스크립트가 제공됩니다. 파이프를 사용하여 이를 증명하는 것은 약간 까다롭습니다. 예를 들어 cat | zsh -iZLE가 이상한 동작을 일으킬 수 있기 때문입니다(자세한 내용은 참조).https://unix.stackexchange.com/a/434839/5132) 물이 약간 흐려집니다. 그러나 ksh -i 2>&1 | cat대화형 Korn 쉘이 생성되는 것을 볼 수 있습니다 .

-s옵션은 재정의하기 위해 존재합니다.다른결정은 첫 번째 인수의 존재가 무시되지 않을 때 프롬프트-읽기-실행 루프를 실행하는 대신 스크립트 실행을 기반으로 합니다. 이 -c옵션은 다른 결정에도 영향을 미칩니다.

  • zsh wibble스크립트 실행을 시도하므로 비대화형입니다.
  • zsh -s wibble스크립트 실행을 시도하지 않고 대신 "무엇을 할지" 결정 선택을 "프롬프트-읽기-실행" 루프로 강제하고 (표준 입력이 터미널인 경우) 대화형이 되도록 합니다.
  • zsh -c wibble명령을 실행 중이므로 비대화형입니다.

여기에서 조합은 논리적으로 이어집니다.

  • zsh -si wibble여전히 (다시) 대화형이며 재정의는 어쨌든 동일한 방식으로 am-I-interactive 결정을 강제합니다( -s강제 선택이 프롬프트-읽기-실행 루프로 들어가기 때문에).
  • zsh -i wibble스크립트를 실행하려고 시도하지만 스크립트(그렇게 보인다면)는 대화형 셸이라고 생각하고 Z 셸이 스크립트 끝에 도달하면 대화형 EOF 동작이 발생합니다.
  • zsh -ci wibble명령은 계속 실행되지만 명령이 다음과 같이 보이면(내장 함수이거나 셸 함수인 경우) 대화형 셸이라고 생각할 것입니다.

...두 가지 예외가 있습니다.

  • zsh -cs wibble비대화형이라고 생각하는 쉘에서 명령을 실행하십시오.
  • zsh -csi wibble마찬가지로, 대화형이라고 생각하는 쉘에서 명령을 실행하십시오.

-c효과적으로 재정의합니다 -s. (Microsoft/IBM/JPSoftware 명령 해석기에는 /K명령을 실행하는 옵션이 있습니다.그 다음에프롬프트-읽기-실행 루프를 입력하십시오. 이는 -c및 의 논리적 조합 -s이지만 Unix 쉘 세계에서는 결코 수행되지 않습니다. )

관련 정보