Bash-実行中のコマンドをよりインタラクティブにする方法は?

ブラッドパークス

常にbashコマンドを実行し、コマンドを(viモードを使用して)正しく編集し続けています。

これには、コマンドに戻ったり、コマンドの途中の場所にジャンプしたり、物事を変更したりすることがよくあります。私はこれをviモードでかなり速く行うことができますが、それでも遅くてエラーが発生しやすいことがわかります。

このようなコマンドをファイルに保存し、ファイルを編集して再実行することもありますが、これは私に考えさせられました...

bashコマンドを繰り返すためのよりインタラクティブな方法はありますか?コマンドへの入力を編集するのが簡単な何らかの方法でREPLのようなものですか?

たとえば、次のコマンドを繰り返しているとします。viモードを使用してコマンドに戻ったり、スクリプトで編集したりせずに、「test」、「super」、「java $」を更新する簡単な方法は何ですか?

$ find . | grep test | grep super | grep java$

別の例として、リモートサーバーに対してcurlを実行していて、別の引数も置き換えたい場合があります。次のように、変数を設定してから、それらをカールに渡すことがあります。

$ curl "http://example.com/$PATH/$PARMS"

しかし、これはより複雑になるため、変数を設定するコマンドなどを履歴で検索するのは多すぎると思います。

ブラッドパークス

改善できると確信していますが、これをまとめて、サブシェルを使用するコマンドの途中でプロンプトを表示できるようにします。したがって、次の簡単な例では、実行するたびに2つのパラメーターをインタラクティブに要求し、その結果を出力します。

$ echo "hi $(ask name), how $(ask old) are you?"
:name (This is a prompt. I supplied "brad" as the value)
:old  (This is another prompt. I supplied "young" as the value)

hi brad, how young are you?

もう一度実行すると、入力用に指定した内容が記憶されます(これらはの一時ファイルに保存されます/tmp)。これは、2番目のパラメーターとして「no」を渡すことで無効にできます。

$ echo "hi $(ask name), how $(ask old) are you?"
:brad (This is a prompt. I supplied "parks" as the value)
:young  (This is another prompt. I hit enter to use the default value)

hi parks, how young are you?

注意:

  • を実行すると、すべてのtmpファイルを削除できます。 ask clear
  • を実行するとヘルプを表示できます ask help
  • read -i古いbashでは利用できないため、これにはbash4.xが必要です。これは、アスクにデフォルト値を提供するためです。自作を使用してbashをアップグレードできます。

これがスクリプトです!

尋ねる

#!/usr/local/bin/bash
me=$(basename "$0")

show_help()
{
it=$(cat <<EOF
  Prompts you for info, allowing a default value that can also
  be updated by being stored in a tmp file.

  Useful for interactively replacing parts of a bash command 
  you're running with a new value easily, instead of having 
  to manually edit the command all the time.

  usage: $me {default_value} {tmp_key} 

  e.g. 

    $me        -> asks for input

    $me HI     -> asks for input, with "HI" supplied as default value. 
                  Saves the user supplied value in a tmp file, and 
                  uses that as the default the next time it's run

    $me 1 no   -> asks for input, with 1 supplied as default value. 
                  If tmp_key is any value other than "no", will 
                  save the user supplied value in a tmp file, and 
                  use that as the default the next time it's run

    $me clear  -> removes any tmp files that have been created.

  A more real example, the following will curl an url at
  a site, and constantly ask you for the page you want to hit,
  remembering the last value you used in a tmp file.

  $ curl http://httpbin.org/\$($me somePage)
EOF
)
  echo "$it"
  exit
}

# Store tmp files in a folder
tmp_file_path="/tmp/__${me}"
mkdir -p "$tmp_file_path"

prompt=":"

if [ "$1" = "help" ]
then
  show_help
fi
if [ "$1" = "clear" ]
then
  rm -fr "$tmp_file_path"
  echo "Removed any tmp files from $tmp_file_path"
  exit;
fi

# Initialize our default value and tmp file name
default_value=${1:-""}
tmp_key_default=$(echo "$default_value" | head -n1 | tr -cd '[[:alnum:]]._-')
tmp_key=${2:-"no"}
if [ -n "$1" ]
then
  if [ -z "$2" ]
  then
    tmp_key=$tmp_key_default
  fi
fi

# Convert tmp_key to lower case
tmp_key=$(echo "$tmp_key" | tr '[:upper:]' '[:lower:]')

# Get the default value to prompt with
tmp_file="$tmp_file_path/$tmp_key"
if [ "$tmp_key" != "no" ]
then
  if [ -f "$tmp_file" ]; then
    default_value=$(cat "$tmp_file")
  fi
fi

# Ask the user for input, supplying the default
read -r -e -p "$prompt" -i "$default_value" result
echo "$result"

# Save the new value to a tmp file if we're supposed to
if [ "$tmp_key" != "no" ]
then
  echo "$result" > "$tmp_file"
fi

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

インタラクティブなbashを使用して新しいDockerコンテナーを起動し、その中でいくつかのコマンドを実行する単一のコマンドラインを作成するにはどうすればよいですか?

分類Dev

Pythonを使用してインタラクティブに開いたbashでコマンドを実行する

分類Dev

インタラクティブなbashシェルでシステムコマンドを実行する

分類Dev

bashでbangコマンドをインタラクティブに拡張する方法は?

分類Dev

bashで現在実行中のコマンドの後にコマンドを実行する方法は?

分類Dev

インタラクティブ環境でbashコマンドを使用するにはどうすればよいですか?

分類Dev

その後、インタラクティブモードを維持しながら、SSH経由でbashコマンドを実行します

分類Dev

bashウィンドウのタイトルを最後に実行したコマンドに設定するにはどうすればよいですか?

分類Dev

bashウィンドウのタイトルを最後に実行したコマンドに設定するにはどうすればよいですか?

分類Dev

bash、コマンドを実行しますが、インタラクティブセッションを続行します

分類Dev

bashでコマンドラインスイッチのタブ補完を有効にする方法は?

分類Dev

Mac bashのコマンドラインからGradleを実行する方法

分類Dev

Bash-サブディレクトリをループしてこのコマンドを実行するにはどうすればよいですか?

分類Dev

Bashで複数のコマンドを実行する方法(一部はバックグラウンドで)

分類Dev

コマンドエラーが発生したときにbashスクリプトの関数を自動実行する方法はありますか?

分類Dev

bashスクリプトの読み取りコマンドが読み取りコマンドとして実行されず、コマンドラインに直接テキストを出力する

分類Dev

bashスクリプトでコマンドラインツールの複数のインスタンスを実行するにはどうすればよいですか?+スクリプトのユーザー入力

分類Dev

単一行のbashで複数のバックグラウンドコマンドを実行するにはどうすればよいですか?

分類Dev

bashのcaseステートメントを使用してバックグラウンドでコマンドを実行する方法は?

分類Dev

bashには、コマンドを実行する前に実行されるフックがありますか?

分類Dev

bashには、コマンドを実行する前に実行されるフックがありますか?

分類Dev

インタラクティブに、bashに数字のn回の繰り返しを入力するにはどうすればよいですか?

分類Dev

バックグラウンドモードで実行中のコンテナにbashまたはsshを取り込む方法は?

分類Dev

インタラクティブなbashセッションを起動する前にカスタムコマンドを指定できますか?

分類Dev

bashでコマンドラインパラメータの次の引数にアクセスする方法は?

分類Dev

複数のディレクトリを入力してコマンドを実行するためのコマンドラインbash

分類Dev

インタラクティブなsshおよびmysqlコマンド用のBashスクリプト

分類Dev

bashでコマンドをN回実行するより良い方法はありますか?

分類Dev

bashでコマンドをN回実行するより良い方法はありますか?

Related 関連記事

  1. 1

    インタラクティブなbashを使用して新しいDockerコンテナーを起動し、その中でいくつかのコマンドを実行する単一のコマンドラインを作成するにはどうすればよいですか?

  2. 2

    Pythonを使用してインタラクティブに開いたbashでコマンドを実行する

  3. 3

    インタラクティブなbashシェルでシステムコマンドを実行する

  4. 4

    bashでbangコマンドをインタラクティブに拡張する方法は?

  5. 5

    bashで現在実行中のコマンドの後にコマンドを実行する方法は?

  6. 6

    インタラクティブ環境でbashコマンドを使用するにはどうすればよいですか?

  7. 7

    その後、インタラクティブモードを維持しながら、SSH経由でbashコマンドを実行します

  8. 8

    bashウィンドウのタイトルを最後に実行したコマンドに設定するにはどうすればよいですか?

  9. 9

    bashウィンドウのタイトルを最後に実行したコマンドに設定するにはどうすればよいですか?

  10. 10

    bash、コマンドを実行しますが、インタラクティブセッションを続行します

  11. 11

    bashでコマンドラインスイッチのタブ補完を有効にする方法は?

  12. 12

    Mac bashのコマンドラインからGradleを実行する方法

  13. 13

    Bash-サブディレクトリをループしてこのコマンドを実行するにはどうすればよいですか?

  14. 14

    Bashで複数のコマンドを実行する方法(一部はバックグラウンドで)

  15. 15

    コマンドエラーが発生したときにbashスクリプトの関数を自動実行する方法はありますか?

  16. 16

    bashスクリプトの読み取りコマンドが読み取りコマンドとして実行されず、コマンドラインに直接テキストを出力する

  17. 17

    bashスクリプトでコマンドラインツールの複数のインスタンスを実行するにはどうすればよいですか?+スクリプトのユーザー入力

  18. 18

    単一行のbashで複数のバックグラウンドコマンドを実行するにはどうすればよいですか?

  19. 19

    bashのcaseステートメントを使用してバックグラウンドでコマンドを実行する方法は?

  20. 20

    bashには、コマンドを実行する前に実行されるフックがありますか?

  21. 21

    bashには、コマンドを実行する前に実行されるフックがありますか?

  22. 22

    インタラクティブに、bashに数字のn回の繰り返しを入力するにはどうすればよいですか?

  23. 23

    バックグラウンドモードで実行中のコンテナにbashまたはsshを取り込む方法は?

  24. 24

    インタラクティブなbashセッションを起動する前にカスタムコマンドを指定できますか?

  25. 25

    bashでコマンドラインパラメータの次の引数にアクセスする方法は?

  26. 26

    複数のディレクトリを入力してコマンドを実行するためのコマンドラインbash

  27. 27

    インタラクティブなsshおよびmysqlコマンド用のBashスクリプト

  28. 28

    bashでコマンドをN回実行するより良い方法はありますか?

  29. 29

    bashでコマンドをN回実行するより良い方法はありますか?

ホットタグ

アーカイブ