Poner en cola los comandos a la última subshel ​​incluso si uno de ellos lanza un nuevo shell

0

Quiero automatizar algo escribiendo guiones simples iniciando consecutivamente unos guiones uno tras otro. Y luego establecer algunos alias en el shell superior.
Problema: algunos de estos comandos lanzan un nuevo shell. Y todos los comandos después de eso se inician en el shell anterior. ¿Hay alguna forma de poner en cola estos comandos después de aquel en el shell "superior"?
Ejemplo simple:

#!/usr/bin/ksh
#normally this ksh is executed deep inside other script i cannot modify
ksh
echo test

¿Hay alguna forma de imprimir "prueba" en el shell recién iniciado por el comando ksh? Normalmente, la prueba se imprime en el shell anterior: queda disponible después del comando "salir" Gracias por cualquier ayuda.

Aleksander Fular
fuente
Su uso de "caparazón superior" es un poco confuso. Te refieres a la última subshell que empezaste, ¿verdad?
Uwe
si eso es correcto.
Aleksander Fular

Respuestas:

0

Cuatro alternativas, pero cada una de ellas tiene un inconveniente:

  1. Asegúrese de que los comandos que desea ejecutar en el archivo ksh estén escritos en el archivo mycmds e iniciar el ksh en la siguiente forma:

    cat mycmds /dev/tty | ksh -i
    

    Retirarse: Se pierden las funciones de edición de línea de comandos de ksh.

  2. Asegúrese de que los comandos que desea ejecutar en el archivo ksh estén escritos en el archivo /tmp/mycmds$$; establecer la variable de entorno MYCMDS a /tmp/mycmds$$ antes de empezar ksh -l; y agrega lo siguiente a tu $HOME/.profile:

    if [ -n "$MYCMDS" ] ; then
        . "$MYCMDS"
        MYCMDS=
        export MYCMDS
    fi
    

    Retirarse: Todo aquel que usa este programa tiene que modificar su $HOME/.profile.

  3. Organice todo de tal manera que los comandos que desea ejecutar se escriban en un archivo mycmds que luego se obtiene a través de . mycmds en el inicial cáscara. Poner todo eso en una definición de función.

    Retirarse : En lugar de iniciar un nuevo shell, modifica el entorno y / o las definiciones de alias del inicial. Todos los que usan este programa tienen que usar ksh.

  4. Asegúrese de que los comandos que desea ejecutar están escritos en el archivo mycmds y comienza un golpetazo en la siguiente forma:

    bash -i --init-file mycmds
    

    Retirarse: Obtienes un golpe en lugar de un ksh.

Uwe
fuente
lshmm, el resultado es casi lo que quiero cuando uso: (cat mycmds / dev / tty) | ksh (sin el -i). Pero el prefijo anterior ... no sé cómo se llama antes - & gt; "puedes escribir aquí" ya no aparece
Aleksander Fular
Se llama "pronta". Sin -i o -l, un ksh que se lee de una canalización no es interactivo ( man ksh ), lo que significa en particular que no hay aviso.
Uwe
Por cierto, los paréntesis alrededor cat mycmds /dev/tty son inútiles Originalmente, tenía dos órdenes aquí; después de eliminar uno de ellos también debería haber eliminado los paréntesis.
Uwe
Mmm, ok. Sin embargo cuando uso el -i. esa ventana de shell está "atascada", ya no acepta comandos. o debería decir que ya no responde. Y sin la opción -i (ya no es interactiva) mis alias de perfil no son visibles en este nuevo shell.
Aleksander Fular
Tienes razón sobre los problemas con -i, y la versión sin esta opción tampoco funciona bien. Iría para el método 2 o 4 (2 es esencialmente una emulación de la bash --init-file opción.)
Uwe