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-相互作用決定に戻ります。 3 つのオプションをすべて使用できます。このオプションを使用すると、対話型または非対話型にすることができます-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コマンドは引き続き実行されますが、コマンドが次のように見える場合(組み込み関数またはシェル関数の場合)、対話型シェルであると思います。

...2つの例外があります。

  • zsh -cs wibble非対話型と思われるシェルでコマンドを実行します。
  • zsh -csi wibble同様に、インタラクティブだと思うシェルでコマンドを実行します。

-c効果的に上書きします-s。 (Microsoft/IBM/JPSoftware コマンド・ソルバーには、/Kコマンドを実行するオプションがあります。それからプロンプト - 読み取り - 実行ループを入力します。これは-cとの論理的な組み合わせ-sですが、Unixシェルの世界では決して行われません。 )

おすすめ記事