$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
私は混乱しています
- 実際に
zsh
とを使用すると、=zsh
他の結果が発生します。 - 実際、最初のケースでは、設定は
COLUMNS=
設定と同じように見えますCOLUMNS=0
。 - 実際、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
が設定されていない場合は検索されるため、env
and (zsh
PATH
/usr/bin
/bin
代替パス)を実行し、そのうちの/usr/bin/zsh
コマンドを実行するenv -i =zsh
zshインスタンスを実行します。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
。