Quiero ejecutar una subshell de bash, (1) ejecutar algunos comandos, (2) y luego permanecer en esa subshell para hacer lo que me plazca. Puedo hacer cada uno de estos individualmente:
-
Ejecutar el comando con
-c
flag:$> bash -c "ls; pwd; <other commands...>"
sin embargo, vuelve inmediatamente al "super" Shell después de ejecutar los comandos. También puedo simplemente ejecutar un subshell interactivo:
-
Iniciar nuevo
bash
proceso:$> bash
y no sale del subshell hasta que yo lo diga explícitamente... pero no puedo ejecutar ningún comando inicial. La solución más cercana que he encontrado es:
$> bash -c "ls; pwd; <other commands>; exec bash"
que funciona, pero no de la manera que yo quería, ya que ejecuta los comandos dados en un subshell, y luego abre uno separado para la interacción.
Quiero hacer esto en una sola línea. Una vez que salgo del subshell, debería volver al "super"Shell normal sin incidentes. Debe haber una manera~~
NB: Lo que no estoy pidiendo...
- no preguntar donde conseguir la página man de bash
- no preguntar cómo leer los comandos de inicialización de un archivo... Sé cómo hacer esto, no es la solución que estoy buscando
- no me interesa usar tmux o gnu screen
- no está interesado en dar contexto a esto. Es decir, la pregunta pretende ser general, y no para ningún propósito específico
- si es posible, quiero evitar el uso de soluciones que más o menos logran lo que quiero, pero de una manera "sucia". Sólo quiero hacer esto en una sola línea. En particular, no quiero hacer algo como
xterm -e 'ls'
0 votos
Puedo imaginar una solución de Expect, pero difícilmente es la de una sola línea que quieres. ¿De qué manera es el
exec bash
¿una solución inadecuada para usted?0 votos
@glennjackman lo siento, no estoy familiarizado con la jerga. ¿Qué es una "solución de expectativa"? Además, el
exec bash
la solución implica dos subshell separados. Quiero una subcapa continua.7 votos
La belleza de
exec
es que sustituye a el primer subshell con el segundo, por lo que sólo queda 1 Shell por debajo del padre. Si tus comandos de inicialización establecen variables de entorno, éstas existirán en el Shell ejecutado.2 votos
Posible mismo stackoverflow.com/questions/7120426/
0 votos
Me rendí, pero no vi que se mencionara esto aquí, así que FWIW:
RUN_CONDITIONAL=true bash --login
y poner sus comandos en .bash_profile o w/e. ni idea de la portabilidad.9 votos
Y el problema con
exec
es que se pierde todo lo que no se pasa a las subshells a través del entorno, como las variables no exportadas, las funciones, los alias, ...3 votos
+1 por añadir todas estas aclaraciones en la pregunta, evita muchas respuestas inútiles
0 votos
¿Ha encontrado una respuesta satisfactoria?
0 votos
Utilizar el truco de las tuberías temporales con nombre es lo único que me permite establecer
trap
en el subshell recién creado, y que sigan presentes cuando el usuario humano escriba en el subshell. Salud.0 votos
Respecto a su punto #3. Es curioso, encontré tu pregunta mientras buscaba lo mismo, pero lo buscaba específicamente para usarlo dentro de pantalla :) Quería iniciar pantalla dividida en dos, ejecutar dos conchas, y luego ejecutar dos contenedores docker dentro. Entonces quiero ser capaz de matar a uno de los contenedores, y rápidamente ejecutarlo de nuevo, así que quería tener que salir de nuevo a la Shell, listo para volver a ejecutar.