de[v|b]log

ShellScript, Coffee, iOS/OSX Dev
Origin: Himajinworks.
About.

ざっくり

zsh 5.3のリリースノートの NEWS を読んだのでメモ。(Incompatibilities(README内)はまだ深く読めていない)
特に修飾子と typeset -p についてメモ。

記載してないものとしては、Unicode9の対応や、viモードの設定関連、また他のShellとの互換性のための機能( -v )があるようである。

:P 修飾子

新しい修飾子である :P は対象に対する物理パスを取得するために利用できる。 以下は従来存在している :A 修飾子との違いである。

前提として、 :a 修飾子は /before/here/../after という入力を解決し、 /before/after (フルパス)を得るために用いられる。

従来存在している :A 修飾子は、 :a 修飾子の動作に追加してSymlinkの解決を行う。
このSymlinkの解決タイミングが :A:P 修飾子の大きな差となる。

修飾子 Symlink解決タイミング
:A パス解決を行った
:P パス解決を行う

これによりどのような影響が出るかという実例が以下。

$ mkdir -p a/b/c x/y/z
$ ln -s x symlink
$ tree

.
├── a
│   ├── b
│   │   └── c
│   └── symlink -> ../x/y/z
└── x
    └── y
        └── z

7 directories, 0 files

$ target=a/symlink/../
$ echo ${target:a}
/private/tmp/work/a

$ echo ${target:A}
/private/tmp/work/a

$ echo ${target:P}
/private/tmp/work/x/y

簡単に書くと、上記 :a , :A では

  1. a/symlink/../
  2. a
  3. /private/tmp/work/a

となっているはず。

それに対して :P

  1. a/symlink/../
  2. a/x/y/z/../
  3. a/x/y
  4. /private/tmp/work/x/y

と解決される。

この差があるため :A の使い方を見直し、 :P の動作が適切でありかつzsh 5.2との互換性が必要ない場合 :P への書き換えを推奨している。

typeset -p

typeset -p は設定されている変数に対しての、設定のためのコマンド列を出力する。 特に typeset -p NAME として変数名を渡した場合、その変数名に対する設定コマンド列を出力する。

従来であればすべての出力結果が typeset ... という形式で出力されていたが、 export ... もしくは typeset -g ... (現在のスコープのローカル変数でない場合)という形式で出力されるようになった。

zsh 5.2-dev-1

$ echo $ZSH_VERSION
5.2-dev-1

$ typeset -p LC_CTYPE
typeset -x LC_CTYPE=UTF-8

zsh 5.3

$ echo $ZSH_VERSION
5.3

$ typeset -p LC_CTYPE
export LC_CTYPE=UTF-8