問題

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が正常に動くので問題ない。