web-dev-qa-db-ja.com

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

私はこのシナリオで頻繁に自分を見つけます。コマンドを入力している最中なので、完了する前に他のことを確認する必要があります。

これまでの入力が記憶されているある種のサブシェルを開く方法はありますか?次に、このサブシェルを終了すると、以前の場所に戻りますか?

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

zshを使用しています

16
Panayiotis

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

(押した後にサブシェルを開こうとしなかった EscQ まだ。)

http://zsh.sourceforge.net/Intro/intro_10.html を参照して、「esc-q」を検索します

16
Bodo

私は通常使用します Ctrl+U これは現在の行を消去し、それをバッファに保存します。そこから、mylongcommandの前に必要なことをすべて行います。次に、準備ができたら使用します Ctrl+Ymylongcommandをプロンプトに貼り付けます。

何かを確認している間、ハーフタイプのコマンドを覚えておいてください

18
Zachary Brady

これに対する私の解決策は明らかにローテクで不格好ですが、おそらくあなたがすでに知っているキーシーケンスに依存しています:Hit Ctrl+A、その後 #、その後 ENTER

これには、行の先頭に#を挿入する効果があり、コメントにしてから実行して、コマンド履歴にプッシュします。次に、補助コマンドを入力し、コマンド履歴を上にスクロールしてコメント化されたコマンドに移動し、#を削除して、必要に応じてコマンドを完了します。

7
Digital Trauma

私はタイプする Ctrl+Z 入力しているコマンドを「中断」して、別のコマンドを入力します。そのコマンドを実行した後(または、 Ctrl+C)、中断されたコマンドは編集のために戻ってきます(カーソル位置を覚えていても)。追加の便宜として、入力時にコマンドラインが空の場合 Ctrl+Z、キーは代わりにbgビルトインを呼び出します(したがって、double Ctrl+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の解決策があり、それほど便利なことはできません。これは the M-qPush-line への組み込みバインディング

これはサブシェルを実行しません。前のコマンドを「中断」した後に入力したコマンドは、同じシェルで実行されます。これにより、コマンドを入力した後で別のディレクトリで実行するつもりであることがわかった場合に、現在のディレクトリを変更することができます。新しいシェルインスタンスを実行する場合は、キーバインディングからzshを実行できますが、これは特に便利だとは思いません。