web-dev-qa-db-ja.com

BASH:whileループでコマンド履歴を表示する方法は?

入力を受け入れる単純なwhileループがあります。

#!/bin/bash
while true; do
    read -rep $'\n '"$USER"'> ' userInput
    echo "$userInput"
done

例:

./input.sh 

 username> command1
command1

 username> command2
command2

コマンド履歴を持つことは可能ですか?キーボードを押し上げて、以前に実行されたコマンドを(whileループを離れることなく)表示できるようにするには?

5
user321630

小さなReadlineラッパーrlwrapを使用できます。これは、自分で実装しないユーティリティにコマンド履歴を提供する、きちんとした小さなツールです。

スクリプト自体にrlwrapを使用します。

rlwrap -a ./script.sh

これにより、~/.script.sh_historyという履歴ファイルが保存され、現在のセッションだけでなく、将来のセッションでもそのファイルを使用して、ステップスルーできる種類の履歴が提供されます。

rlwrapのマニュアルを参照してください。

rlwrapは、ほとんどのUnicesでパッケージとして一般的に入手できますが、 そのGitHubリポジトリ から入手することもできます。

8
Kusalananda

history -sを使用して履歴リストを編集し、read -eを使用して履歴を表示できるようにすることができます。

#!/bin/bash
while true; do
    read -rep $'\n '"$USER"'> ' userInput
    history -s "$userInput"
    echo "$userInput"
done

コマンド履歴にはさまざまなオプションがあることに注意してください。スクリプトとインタラクティブシェルでは、動作が大きく異なる場合があります。たとえば、コマンド履歴はスクリプトでファイルから自動的にロードまたはファイルに保存されません。これは、状況によっては望ましい場合と望ましくない場合があります。しかし、そうでない場合はコードを追加することで修正できます。

0
user23013