zshのシェル関数でユーザー入力を受ける時はvaredを使う
問題
zshのシェル関数内で read を使ってユーザー入力を受けると、Backspace/Deleteキーで文字を消した時に表示がバグる。
# これだと表示がおかしくなる
my_func() {
local name
read -r "name?名前を入力: "
echo "$name"
}
入力中にBackspaceを押すと ^? や ^H が表示されたり、カーソル位置と実際の文字列がずれる。
原因
zshの read ビルトインはzle(Zsh Line Editor)を使わず、端末から直接読み取る。そのためターミナルの行編集機能(Backspace、Delete、カーソル移動)が正しく処理されない場合がある。
解決策: varedを使う
vared はzshのビルトインで、zleを使って変数を編集する。通常のコマンドラインと同じ行編集が使える。
my_func() {
local name=""
vared -p "名前を入力: " name
echo "$name"
}
varedの主要オプション
| オプション | 説明 |
|---|---|
-p prompt |
プロンプト文字列を指定 |
-c |
変数の初期値をクリア |
-h |
ヒストリを有効にする |
使い分け
| 用途 | 推奨 |
|---|---|
| 自由入力(ファイル名、説明文等) | vared |
| Y/N の1文字確認 | read でも可 |
bashスクリプト(#!/bin/bash) |
read -rp(varedはzsh専用) |
vared はzsh専用なので、#!/bin/bash スクリプトでは使えない。bashの read -rp はBackspace/Deleteが正常に動くので問題ない。