一般的な(POSIX)シェルからread -e
(readline
による行編集をオンにし、bash
で利用可能)の効果を得るにはどうすればよいですか?この1つのコマンドだけが原因でPOSIX互換性を失いたくない。
readline
はGNUプロジェクト(bash
と一緒に開発された)です。BSDlibeditのような他の代替手段があり、すべてのPOSIXシェルには固有のラインエディターがあります。シェルに追加するか、少なくともvi
編集モード(POSIXで指定されている唯一の編集モード)を実装するライブラリのいずれかに基づいていますが、ほとんどの場合、emacs
モードもサポートしています(POSIXで指定されていないため= RMS反対))).
ただし、POSIXはread
ではなく、シェルコマンドラインの行編集モードのみを指定します。
ksh93
はread
でもサポートします(標準入力と標準エラー出力が端末デバイスにある場合)。そこで、あなたは行うことができます:
set -o emacs
IFS= read -r 'line?prompt: '
zsh
に相当するものは、組み込みのvared
(変数エディター)を使用したものです。
line=; vared -p 'Prompt: ' line
これは、その履歴処理と、キーのバインドと補完の完全なカスタマイズにより、最も機能が豊富です。
read -e
はbash
固有です。
IFS= read -rep 'Prompt: ' variable
同等のPOSIXはありません。 POSIXlyでは、vi
(POSIXで指定)を起動して一時ファイルを編集し、そのファイルの内容を変数に読み込むことができます。
または、zsh
/bash
/ksh93
またはrlwrap
のいずれか、またはlibreadlineの他のラッパー、またはsocat
の可用性を探すこともできます。 (readline
サポート付きでビルドされている場合)、可能な場合はそれらを使用して行を読み取るか、そうでない場合はプレーンread
またはvi
に戻します。
または、限定されたLE
に似たラインエディターを実装する emacs
この同様のQ&Aに見られるラインエディター関数 を使用します。
POSIX read
は-r
のみをサポートします(バックスラッシュを読み取れるようにするため)。後で解析するファイルのエディターを起動しない限り、ユーザーに入力を求めてコマンドラインのような編集を提供する方法はありません。