Exécution d'un sous-shell à partir du milieu de la commande actuelle

16

Je me retrouve souvent dans ce scénario. Je suis en train de taper une commande et je dois vérifier autre chose avant de la terminer.

Existe-t-il un moyen d'ouvrir un sous-shell d'une sorte avec mon entrée actuelle jusqu'à présent mémorisée, puis lorsque je quitte ce sous-shell, je suis de retour à l'endroit où j'étais?

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

j'utilise zsh

Panayiotis
la source
2
Pourquoi ne pas simplement ouvrir une autre fenêtre de terminal?
Barmar
@Barmar Pour moi, je n'utilise pas d'interface graphique sur la plupart de mes systèmes Linux, donc je devrais changer de TTY. Ce qui signifie que je dois me ré-authentifier. Les options ci-dessous sont beaucoup plus efficaces.
Zachary Brady
3
Vous pouvez utiliser screenou tmuxpour obtenir plusieurs terminaux virtuels sur la console.
Barmar

Réponses:

16

Il y a la combinaison de touches EscQqui enregistre le tampon de commande et permet d'entrer une nouvelle commande. Après avoir exécuté la commande, le tampon contient ce que vous avez tapé auparavant. Si vous devez exécuter une autre commande avant de terminer, vous pouvez taper à EscQnouveau.

(Je n'ai pas encore essayé d'ouvrir un sous-shell après avoir appuyé sur EscQ.)

Voir http://zsh.sourceforge.net/Intro/intro_10.html et recherchez "esc-q"

Bodo
la source
C'est exactement ce que je voulais, merci beaucoup! Je pourrais lui faire exécuter un shell imbriqué au lieu de revenir tout de suite mais pour mon cas d'utilisation, le retour tout de suite fonctionne parfaitement.
Panayiotis
7

Ma solution est résolument low-tech et maladroite, mais repose sur des séquences de touches que vous connaissez probablement déjà: Hit Ctrl+ A, alors #, alors ENTER.

Cela a pour effet d'insérer un #au début de la ligne, ce qui en fait un commentaire, puis de l'exécuter, le poussant ainsi dans l'historique des commandes. Vous pouvez alors entrer votre commande auxiliaire, puis faire défiler l'historique de la commande jusqu'à la commande commentée, la supprimer #et terminer la commande au besoin.

Traumatisme numérique
la source
Vous devez appuyer sur le bouton "home" de votre clavier, cela permet d'économiser 1 pression de touche et l'énergie nécessaire pour réellement appuyer dessus
Ferrybig
@Ferrybig - oui, c'est bien, mais pour mon clavier au jour le jour, c'est un MacBook Pro qui n'a pas de touche HOME . L' équivalent HOME est FN + LEFT ARROW , mais qui défile jusqu'en haut du terminal.
Digital Trauma
2

Je tape Ctrl+ Zpour «suspendre» la commande que je tape et saisis une autre commande. Après avoir exécuté cette commande (ou l'avoir abandonnée avec Ctrl+ C), la commande suspendue revient pour l'édition (même en se souvenant de la position du curseur). Pour plus de commodité, si la ligne de commande est vide lorsque je tape Ctrl+ Z, la touche invoque la fonction bgintégrée à la place (donc un double Ctrl+ Zenvoie une commande en cours d'exécution directement en arrière-plan).

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

(Précédemment publié sur Se souvenir d'une commande à moitié tapée pendant que je vérifie quelque chose qui a principalement des solutions pour bash, où vous ne pouvez rien faire de plus pratique. Il s'agit d'une version légèrement plus sophistiquée de la liaison intégrée de M-qtopush-line .)

Cela n'exécute pas de sous-shell: la commande que vous tapez après avoir «suspendu» la précédente s'exécute dans le même shell. Cela vous permet de faire des choses comme changer le répertoire courant si vous vous rendez compte après avoir tapé une commande que vous vouliez l'exécuter dans un autre répertoire. Si vous souhaitez exécuter une nouvelle instance de shell, vous pouvez exécuter à zshpartir d'une liaison de clé, mais je ne pense pas que ce soit particulièrement utile.

Gilles 'SO- arrête d'être méchant'
la source