現在のコマンドの途中でサブシェルを実行する

現在のコマンドの途中でサブシェルを実行する

私はしばしばこのような状況にあります。コマンドを入力していますが、コマンドを完了する前に他の点を確認してください。

ある種のサブシェルを開き、これまでの現在の入力を覚えてから、このサブシェルを終了すると元の場所に戻る方法はありますか?

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

私はそれを使用していますzsh

答え1

私は通常Ctrl+を使用してU現在の行を消去してバッファに保存します。そこから私は以前にやらなければならなかったことを始めましたmylongcommand。その後、準備ができたらCtrl+を使用してプロンプトに再度Y貼り付けます。mylongcommand

何かを確認するときに半分だけ入力されたコマンドを覚えておいてください

答え2

EscQコマンドバッファを保存して新しいコマンドを入力できるキーの組み合わせがあります。コマンドを実行した後、バッファには以前に入力した内容が含まれます。これを完了する前に別のコマンドを実行する必要がある場合は、EscQそのコマンドを再入力できます。

(私はサブシェルを押した後に開こうとしませんでしたEscQ。)

バラよりhttp://zsh.sourceforge.net/Intro/intro_10.html"esc-q"を検索してください。

答え3

Ctrl私の解決策は間違いなく技術レベルが低くて愚かですが、+ A、、を#タップするなど、すでに慣れているキーシーケンスに依存していますENTER

#これは、行の先頭に a を挿入してコメントにし、実行してコマンド履歴にプッシュする効果があります。その後、補助コマンドを入力し、コマンド履歴をコメントアウトされたコマンドまでスクロールし、#必要に応じてコマンドを削除して完了できます。

答え4

Ctrl+と入力して、Z入力しているコマンドを「一時停止」し、別のコマンドを入力します。コマンドを実行した後(またはCtrl+で中断C)、保留中のコマンドが編集用に返されます(カーソル位置も記憶されます)。便宜上Ctrl、+を入力してもコマンドラインが空の場合、Zそのキーは組み込みbgコマンドを呼び出します。したがって、Ctrl+を2回押すと、Z実行中のコマンドがバックグラウンドに直接送信されます。

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(以前に投稿した何かを確認するときに半分だけ入力されたコマンドを覚えておいてください主にそれほど便利に何もできないbashソリューションがあります。これはもう少し進化したバージョンです。M-qへの組み込みバインディングpush-line.)

これはサブシェルを実行しません。前のコマンドを「一時停止」した後に入力したコマンドは、同じシェルで実行されます。コマンドを入力した後に別のディレクトリで実行しようとしたことがわかったら、現在のディレクトリを変更するなどの操作を実行できます。新しいシェルインスタンスを実行するには、zshキーバインディングを介して実行できますが、これは特に役に立つとは思いません。

関連情報