web-dev-qa-db-ja.com

-eに代わるPOSIXシェルはありますか?

一般的な(POSIX)シェルからread -ereadlineによる行編集をオンにし、bashで利用可能)の効果を得るにはどうすればよいですか?この1つのコマンドだけが原因でPOSIX互換性を失いたくない。

5
Socob

readlineはGNUプロジェクト(bashと一緒に開発された)です。BSDlibeditのような他の代替手段があり、すべてのPOSIXシェルには固有のラインエディターがあります。シェルに追加するか、少なくともvi編集モード(POSIXで指定されている唯一の編集モード)を実装するライブラリのいずれかに基づいていますが、ほとんどの場合、emacsモードもサポートしています(POSIXで指定されていないため= RMS反対))).

ただし、POSIXはreadではなく、シェルコマンドラインの行編集モードのみを指定します。

ksh93readでもサポートします(標準入力と標準エラー出力が端末デバイスにある場合)。そこで、あなたは行うことができます:

set -o emacs
IFS= read -r 'line?prompt: '

zshに相当するものは、組み込みのvared(変数エディター)を使用したものです。

line=; vared -p 'Prompt: ' line

これは、その履歴処理と、キーのバインドと補完の完全なカスタマイズにより、最も機能が豊富です。

read -ebash固有です。

IFS= read -rep 'Prompt: ' variable

同等のPOSIXはありません。 POSIXlyでは、vi(POSIXで指定)を起動して一時ファイルを編集し、そのファイルの内容を変数に読み込むことができます。

または、zsh/bash/ksh93またはrlwrapのいずれか、またはlibreadlineの他のラッパー、またはsocatの可用性を探すこともできます。 (readlineサポート付きでビルドされている場合)、可能な場合はそれらを使用して行を読み取るか、そうでない場合はプレーンreadまたはviに戻します。

または、限定されたLEに似たラインエディターを実装する emacsこの同様のQ&Aに見られるラインエディター関数 を使用します。

5

POSIX read-rのみをサポートします(バックスラッシュを読み取れるようにするため)。後で解析するファイルのエディターを起動しない限り、ユーザーに入力を求めてコマンドラインのような編集を提供する方法はありません。

2
Kusalananda