Posso generare un nuovo terminale che è un clone del terminale corrente?


8

Diciamo quindi che sto sviluppando il codice nella directory / asdf / qwer / dfgh / wert / asdf / qwer e ho aggiunto altre tre directory simili al mio percorso e ho impostato un gruppo di variabili di ambiente arcane. Poi mi rendo conto che ho davvero bisogno di un altro terminale aperto e configurato esattamente allo stesso modo (anche se questa necessità non si ripresenta in modo da modificare il mio .bashrc). Esiste un comando per aprire una nuova finestra del terminale che è un clone esatto di questo?

Risposte:


10

La clonazione del percorso è semplice se è possibile eseguire il programma terminale dalla riga di comando. Supponendo che stai utilizzando xterm, basta eseguire xterm &dal prompt del terminale che si desidera clonare. Il nuovo xterm verrà avviato nella stessa directory, a meno che non sia stato configurato per l'avvio come shell di accesso. Anche le variabili d'ambiente esportate verranno trasferite, mentre le variabili non esportate no.

Un modo rapido e sporco per clonare l'intero ambiente (comprese le variabili non esportate) è il seguente:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

Se hai impostato delle opzioni di shell personalizzate, dovrai riapplicare anche quelle.

Potresti avvolgere l'intero processo in uno script facilmente eseguibile. Chiedi allo script di salvare l'ambiente in un file noto, quindi eseguirlo xterm. Chiedi al tuo .bashrc di cercare quel file, e procuralo e cancellalo se trovato.


In alternativa, se non si desidera avviare un terminale da un altro o si desidera semplicemente un maggiore controllo, è possibile utilizzare una coppia di funzioni definite in .bashrc:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

EDIT : modificato in putstatemodo da copiare lo stato "esportato" delle variabili della shell, in modo che corrisponda all'altro metodo. Ci sono anche altre cose che potrebbero essere copiate, come le opzioni della shell (vedi help set) - quindi c'è spazio per miglioramenti in questo script.


Wow ... bella spiegazione che ha portato ad alcune intuizioni che ho avuto prima.
John Berryman,

Ho modificato il tuo script per prendere un argomento e posizionare il put e ottenere l'ambiente in un file chiamato dall'argomento ... ora posso avere diversi ambienti! : D
John Berryman,

Domanda: cosa significa "." fare a getstate?
John Berryman,

Il "." dice "Esegui il contenuto di questo file usando la shell corrente, come se fosse stato digitato dalla riga di comando". Senza ".", Una nuova copia di basheseguirà i comandi nel file e quindi uscirà, e l'ambiente della shell corrente non cambierebbe.
Jander,

0

Se avvii una screen(Schermata GNU) nel tuo ambiente definito, quell'ambiente verrà utilizzato dal processo secondario (cioè screen) e puoi usarlo per generare nuovi terminali. Ma se vuoi rovesciarlo un'altra volta (a screenin a screen) inizia a essere complicato.


0

In una situazione simile, ho anche trovato utile avviare la nuova shell nella stessa directory di quella corrente. Ho usato una ricetta come questa per avviare la shell.

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

L'opzione -t è necessaria ogni volta che si esegue esplicitamente una shell usando ssh. Causa una pseudo-tty da creare per il processo. Ciò è necessario per il corretto funzionamento dei comandi della cronologia e di altre funzionalità interattive. Le righe precedenti nello script hanno impostato DIR sulla directory corrente e SHELL sulla shell preferita dell'utente.


0

mentre le variabili esportate arrivano dall'altra parte usando la funzione 'getstate' sopra, per qualche motivo finiscono per non essere esportate lì (come si può vedere usando un semplice os.getenv da Python). sembra funzionare meglio per me quando si modifica getstate per essere un alias:

alias getstate=". ~/environment.tmp"
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.