zshと列

zshと列

$COLUMNS変数の動作を理解できませんzsh。これが私が言う行動の例です。スクリプトは$HOME/cols.sh次のとおりです。

echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS
COLUMNS=
echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS

このスクリプトを使用するかenv -i zsh実行するかに応じて、他の結果が表示されますenv -i =zsh

% env -i zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=0
COLUMNS=0

% env -i =zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=80
COLUMNS=80

私は混乱しています

  1. 実際にzshとを使用すると、=zsh他の結果が発生します。
  2. 実際、最初のケースでは、設定はCOLUMNS=設定と同じように見えますCOLUMNS=0
  3. 実際、2番目のケースでは、設定はCOLUMNS=何の影響も与えないようです。

この資料では、これらの問題に関する多くの情報を提供していません。

COLUMNS <S>
       The number of columns for this terminal session.  Used for printing select lists and
       for the line editor.

今後、

% which zsh
/usr/local/bin/zsh
% echo =zsh
/usr/local/bin/zsh
% =zsh --version
zsh 5.0.2 (x86_64-apple-darwin11.4.2)

答え1

Stéphane Chazelasがコメントで説明したように、zsh異なる=zshディレクトリに2つのzshバージョンがあるため、異なる結果が得られます。 forenv -i zshが設定されていない場合は検索されるため、envand (zshPATH/usr/bin/bin代替パス)を実行し、そのうちの/usr/bin/zshコマンドを実行するenv -i =zshzshインスタンスを実行します。env拡大する=zsh現在の検索パス(の現在値)へのフルパスPATH、つまり/usr/local/bin/zsh

行動の違いは次のようになります。9af1cd47229041fda4dc07f0ef70691a64d49908 送信、より具体的にパッチ30533、zsh 5.0.0 がリリースされる前にリリースされました。 (COLUMNSコミット履歴を検索してこのコミットを見つけ、影響があったことを実験的に確認しました。)

COLUMNS常に現在の端末幅で更新される「魔法の」変数です。 zsh 4.xより前のバージョンでは、設定はターミナルのサイズ変更を試みCOLUMNSましたが、うまく機能しなかったため、zsh 5.0.0では関連コードが削除されました。したがって、最新バージョンの zsh では、COLUMNS対話型シェルの設定は適用されません。すぐに端末の幅で再更新されます。以前のバージョンでは、数値以外の値(空の文字列など)を設定すると値が整数である必要があるため、変数をゼロに設定するのと同じ効果がありました。

答え2

これが今起こっていることです。

まず、ご存知のように、COLUMNSは端末に画面の幅を知らせる変数です。時々シェルはそれを設定するので、それを設定するCOLUMNS=と、シェルは端末によって検出された実際の列数で値を更新します。

次に、このコマンドはzshを実行してスクリプトを処理します。

env -i zsh -flc '. ~/cols.sh'

第三に、このコマンドは他のシェル(これを実行したのと同じシェル、または$ SHELLの値であると思う)を実行してからほとんど=zsh無視します。

env -i =zsh -flc '. ~/cols.sh'

これは実際には効果があるように見えますが、=zsh「空の」環境変数名をサポートするシェルがないと思うので、これがどのように役立つかはわかりません。

env -i =zsh env

出力はです=zsh。これは、名前がに設定されていない変数があることを意味しますzsh

関連情報