「PS2」変数を使用してBashの「スクラッチ」エイリアスを調整するには?

「PS2」変数を使用してBashの「スクラッチ」エイリアスを調整するには?

数行の文字(数学式を単純化するため)をすばやく入力してから、内容全体を削除する必要があることがよくあります。もちろん、私のテキストエディタには通常、私ができる複数の実行セッションがあります。私も次のシステムを使用しています。echo "端末に入力し(bashを実行)、完了したら何でも入力します"

昨日、私はもっとエレガントなものをmyに追加することにしました、そして.bashrc次のエイリアスを作りました。

# write junk on the terminal (stop with a line containing only "." )
# alias scratch="awk '/^\.$/{exit}'"
# alias scratch="sed -ne '/^\.$/q'"
alias scratch='grep -q "^\.$"'

上記の3つのバリエーションが同じことをすることがわかります。を入力してscratchから入力したい項目を入力し、最後に.(ドット)のみを含む行で終わります。

私はこれに非常に満足していますが、次のようなバリエーションも考えました。

alias scratch="cat - > /dev/null << ."

>各行の先頭に初期プロンプトが表示されても、同じことを行います。

その後、環境変数を使用してこのプロンプトを変更する方法を知りたかったのですが、完全に機能するものを取得PS2できませんでした。もちろんPS2、完了したら現在のプロンプトを復元する必要があります。scratch「一時」セッション中にのみ、このエイリアスバリアントのヒントを任意の文字列に設定するにはどうすればよいですか?

ベストアンサー1

これが何に役立つか(またはあなたが好きなエディタと比較してnano)完全に自信はありませんがvim...エイリアスが必要ですか?

$ <<.
> foo
> bar
> baz
> .

長さは"短くなりますが、エラーメッセージが表示されます。

$ "
> oh
> ah
> ui
> "
bash: $'\noh\nah\nui\n': command not found

ちなみに、これらは本当に消えません...

$ history
  497  <<.
foo
bar
baz
.

これが面倒な場合は、まず履歴を無効にするか、後で消去してください。

(少なくともBashの場合)親シェルに設定する必要があるため、カスタムPS2プロンプトではこれは困難です。サブシェルで設定すると無視されます。次のように明示的なシェルインスタンスを起動すると、この問題を解決できます。

$ PS1=@_ PS2=:_ bash --norc
@_<<.
:_hey
:_.
@_exit
$

ただし、この時点で専用の準備と削除プログラムを作成する方が合理的です。

PS2プロンプトをまったく使用しない他の方法:

$ while read -p ":-> " ; do : ; done
:-> hey
:-> how 
:-> do

ここから出ると「.」が使えないというだけです。その後、簡単に条件として追加できます。

$ alias scratch='(var=_; while read -r -p ":-> " var; do [ "$var" == . ] && break; done)'
$ scratch
:-> a
:-> b
:-> c
:-> .

Ctrlただし、+を使用してEOFを送信して終了することもできますD

おすすめ記事