Yash 2 その 146
コマンド置換やコマンドリダイレクトの中身を解析するタイミングを変更した。
例えば以下のようなコードでは、コマンド置換がいつ解析されるかによって出力結果が変わる。
myfunc () { echo $(echo foo); }
alias echo=':'
myfunc
最初の関数定義を解析・実行する段階でコマンド置換の中身も解析してしまうのならば、コマンド置換の中身は echo foo
であるから、最後に myfunc 関数を実行する際には foo が出力される。しかし、myfunc 関数を実行する際にコマンド置換の中身を解析するのであれば、コマンド置換の中身はエイリアス置換によって : foo
となるから、出力は空行となる。
コマンド置換の中身をいつ解析するかに関する POSIX の規定は曖昧だが、bash 4.0.23 や zsh 4.3.9 や ksh93 2009-06-30 など多くのシェルは後者である。前者の方式は dash 0.5.5.1 や posh 0.6.18 などマイナーなシェルの幾つかが採用しているが、コマンド置換を行う度に中身を解析する後者の方式よりも中身を一度だけ解析する前者の方式の方が実は効率が良い。また前者では、中身におけるエイリアス置換はそのコマンド置換を含んでいる関数 (一般的にはコマンド) が解析されるときに一緒に行われるので、後で定義したエイリアスがコマンド置換の中身に影響したりすることもない。
Yash は従来は後者の方式を採用していたが、効率と分かりやすさのために前者に変更することにした。ただし、POSIX 準拠モードでエイリアスが有効な時は従来通り後者の方式で動作する。
| 固定リンク
コメント