¿Puedo generar un nuevo terminal que sea un clon del terminal actual?

8

Digamos que estoy desarrollando código en el directorio / asdf / qwer / dfgh / wert / asdf / qwer y he agregado unos tres directorios más a mi ruta y tengo un conjunto de variables de entorno arcanas. Entonces me doy cuenta de que realmente necesito otro terminal abierto y configurado de la misma manera (aunque esta necesidad no es recurrente, por lo que simplemente alteraría mi .bashrc). ¿Hay algún comando para abrir una nueva ventana de terminal que sea un clon exacto de este?

John Berryman
fuente

Respuestas:

10

Clonar la ruta es fácil si puede ejecutar su programa de terminal desde la línea de comandos. Suponiendo que esté usando xterm, simplemente ejecute xterm &desde el indicador del terminal que desea clonar. El nuevo xterm se iniciará en el mismo directorio, a menos que lo haya configurado para iniciarse como un shell de inicio de sesión. Cualquier variable de entorno exportada también se transferirá, pero las variables no exportadas no.

Una manera rápida y sucia de clonar todo el entorno (incluidas las variables no exportadas) es la siguiente:

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

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

Si ha configurado opciones de shell personalizadas, deberá volver a aplicarlas también.

Podría envolver todo este proceso en un script fácil de ejecutar. Haga que el script guarde el entorno en un archivo conocido y luego ejecútelo xterm. Haga que su .bashrc verifique ese archivo, y descárguelo y elimínelo si lo encuentra.


Alternativamente, si no desea iniciar un terminal desde otro, o simplemente desea más control, podría usar un par de funciones que defina en .bashrc:

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

getstate () {
    . ~/environment.tmp
}

EDITAR : Modificado putstatepara que copie el estado "exportado" de las variables de shell, para que coincida con el otro método. También se pueden copiar otras cosas, como las opciones de shell (ver help set), por lo que hay espacio para mejorar este script.

Jander
fuente
Wow ... una explicación genial que condujo a algunas ideas que he tenido antes.
John Berryman
Modifiqué tu script para tomar un argumento y colocar el put y llevar el entorno a un archivo llamado por el argumento ... ¡ahora puedo tener varios entornos! : D
John Berryman el
Pregunta: ¿qué significa "." hacer en getstate?
John Berryman el
Los "." dice: "Ejecute el contenido de este archivo utilizando el shell actual, como si estuvieran escritos en la línea de comando". Sin el ".", Una nueva copia de bashejecutaría los comandos en el archivo y luego saldría, y el entorno actual del shell no cambiaría.
Jander
0

Si inicia una screen(Pantalla GNU) en su entorno definido, el subproceso (es decir screen) usará ese entorno y podrá usarlo para generar nuevos terminales. Pero si quieres bifurcarlo en otro momento (a screenen a screen) comienza a ser complicado.

concha
fuente
0

En una situación similar, también me pareció útil iniciar el nuevo shell en el mismo directorio que el actual. Usé una receta como esta para comenzar la cáscara.

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

La opción -t es necesaria siempre que ejecute explícitamente un shell utilizando ssh. Hace que se cree una pseudo-tty para el proceso. Esto es necesario para que los comandos del historial y otras características interactivas funcionen correctamente. Las líneas anteriores en el script establecen DIR en el directorio actual y SHELL en el shell preferido del usuario.

Chris Quenelle
fuente
0

mientras que las variables exportadas llegan al otro lado usando la función 'getstate' anterior, por alguna razón terminan no siendo exportadas allí (como se puede ver usando un simple os.getenv de python). parece funcionar mejor para mí al modificar getstate para que sea un alias:

alias getstate=". ~/environment.tmp"
srepmub
fuente