わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

zshのファイル名補完に驚く

一昨日の記事で,Rubyスクリプトのファイル名をbyoin.rbとしていました.実行のたびに,Webアクセスする必要はないので,一度アクセスして得た内容はbyoin.htmlに保存し,このファイルがあれば,そこから読み出すようにしました.それと,実行結果はリダイレクションでbyoin.txtに保存し,それを,byoin.rbの後部に(=beginと=endの行の間に)貼り付けました.
作業ディレクトリのbyoin.rbを,Rubyスクリプトの保管用ディレクトリに移し,byoin.htmlとbyoin.txtを削除しようとしたときに,思いもよらなかった事態が起こりました.
この2つのファイルを削除するコマンドとして,

rm byoin.*

rm byoin.html byoin.txt

が容易に思い浮かぶのですが,後者を実行しようとして

rm byoin.html byoin

まで打ち込んでから,Tabキーを押すと,

rm byoin.html byoin.txt

となってくれたのです.
シェルによるファイル名補完の振る舞いとして,これまた容易に推測できるのは,「byoinから始まるファイル名は,byoin.htmlとbyoin.txtがあるので,そのことをメッセージで表示する」です.実際,

rm byoin

まで打ち込んでから,Tabキーを押すのだと,プロンプトのすぐ下の行に「byoin.html」と「byoin.txt」が出ました.
なのですが,引数ですでにbyoin.htmlを指定してれば,「byoin」と打ち込んだ後のファイル名補完がbyoin.txtだけになる,とシェル(zsh)が判断した*1のに,驚きを隠せなかったのでした.
念のため,bashで「rm byoin.html byoin」を打ち込んでから,Tabキーを2回押したら,「byoin.html」と「byoin.txt」が出ました.

*1:~/.zshrcを読み直したところ,補完に関する設定として,「autoload -U compinit」と「compinit -u」を書いていました.