Esecuzione di una subshell dal centro del comando corrente


16

Mi trovo spesso in questo scenario. Sto scrivendo un comando e devo controllare qualcos'altro prima di completarlo.

C'è un modo per aprire una subshell di qualche tipo con il mio input attuale finora ricordato, quindi quando esco da questa subshell sono tornato dove ero?

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

sto usando zsh


2
Perché non aprire semplicemente un'altra finestra del terminale?
Barmar,

@Barmar Per me, non uso una GUI sulla maggior parte dei miei sistemi Linux, quindi dovrei cambiare TTY. Ciò significa che devo eseguire nuovamente l'autenticazione. Le opzioni seguenti sono molto più efficienti.
Zachary Brady,

3
È possibile utilizzare screeno tmuxper ottenere più terminali virtuali sulla console.
Barmar

Risposte:


16

C'è la combinazione di tasti EscQche salva il buffer dei comandi e consente di inserire un nuovo comando. Dopo aver eseguito il comando, il buffer contiene ciò che è stato digitato in precedenza. Se è necessario eseguire un altro comando prima di terminarlo, è possibile digitare EscQnuovamente.

(Non ho ancora provato ad aprire una subshell dopo aver premuto EscQ.)

Vedi http://zsh.sourceforge.net/Intro/intro_10.html e cerca "esc-q"


Questo è esattamente quello che volevo, grazie mille! Potrei far funzionare una shell nidificata invece di tornare immediatamente, ma per il mio caso il ritorno immediatamente funziona perfettamente.
Panayiotis,


7

La mia soluzione a questo è decisamente a bassa tecnologia e goffa, ma si basa su sequenze di tasti che probabilmente hai già familiarità: Hit Ctrl+ A, quindi #, quindi ENTER.

Ciò ha l'effetto di inserire #a all'inizio della riga, trasformandolo in un commento, quindi eseguendolo, quindi inserendolo nella cronologia dei comandi. È quindi possibile immettere il comando ausiliario, quindi scorrere verso l'alto nella cronologia dei comandi fino al comando commentato, rimuovere #il comando e completare il comando secondo necessità.


Dovresti premere il tasto "home" sulla tastiera, si risparmia 1 pressione dei tasti e l'energia necessaria per premerlo effettivamente
Ferrybig

@Ferrybig - sì, va bene, anche se per la mia tastiera quotidiana è un MacBook Pro che non ha un tasto HOME . L' equivalente HOME è FN + FRECCIA SINISTRA , ma scorre verso l'alto del terminale.
Trauma digitale

2

Digito Ctrl+ Zper "sospendere" il comando che sto digitando e digitare un altro comando. Dopo aver eseguito quel comando (o interrotto con Ctrl+ C), il comando sospeso ritorna per l'edizione (anche ricordando la posizione del cursore). Come ulteriore comodità, se la riga di comando è vuota quando digito Ctrl+ Z, la chiave invoca invece il bgbuilt-in (quindi un doppio Ctrl+ Zinvia un comando in esecuzione direttamente in background).

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

(Precedentemente pubblicato su Ricorda un comando mezzo digitato mentre controllo qualcosa che ha principalmente soluzioni per bash, in cui non puoi fare nulla di così conveniente. Questa è una versione leggermente più elaborata dell'associazione integrata di M-qapush-line .)

Questo non esegue una subshell: il comando che digiti dopo aver “sospeso” quello precedente viene eseguito nella stessa shell. Questo ti consente di fare cose come cambiare la directory corrente se ti rendi conto dopo aver digitato un comando che intendevi eseguirlo in una directory diversa. Se si desidera eseguire una nuova istanza della shell, è possibile eseguire zshda un'associazione chiave, ma non credo sia particolarmente utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.