¿Cómo puedo ejecutar un comando y salir inmediatamente de la terminal?

¿Cómo puedo ejecutar un comando y salir inmediatamente de la terminal?

Debería quedar bastante claro lo que estoy intentando hacer:

guión original.sh:

select blah in foo bar oof rab
do
  cmd $blah
  break
done

Cosas bastante básicas. El problema surge cuando intento lo siguiente:

> xterm -e 'script.sh'

script.sh funciona bien cuando se llama desde un shell. Pero cuando intento llamarlo desde fvwm, no veo resultados de " cmd $blah". Probar la siguiente modificación no me sirve de nada:

select blah in foo bar oof rab
do
  nohup cmd $blah > /dev/null 2>&1 &
  break
done

¿Cómo puedo lograr la funcionalidad deseada? (Es decir, ¿cómo puedo hacer que un xterm aparezca el tiempo suficiente para hacer una selección y luego suprimirse mientras se ejecuta un comando en segundo plano?)

Respuesta1

Puede agregar como última línea de su secuencia de comandos unespera PIDLa instrucción con el PIDcomando en segundo plano que le interesa finalizará. Por supuesto, debes almacenar eso PIDen tu script.

#!/bin/bash 
# do first stuff...
select blah in foo bar oof rab
do
  cmd $blah &
  PID_TO_WAIT_FOR=$!  # here you store the PID of the last command
  break
done
# do other stuff 
wait  $PID_TO_WAIT_FOR

Notas:

  • esperar es un comando incorporado del shell.Espera a que se complete cada proceso especificado y devuelva su estado de terminación. Puedes consultar estoayuda.

Respuesta2

¿Le convendrá si lo ejecuta en una nueva xtermsesión y luego sale de su terminal actual? Debería dejar el nuevo funcionando.

xterm -e "bash -c \"./script.sh; exec bash\"" &

EDITAR:

El siguiente enfoque le permite ejecutar un script desde la GUI en la terminal, seleccionar el comando para ejecutar, salir de la terminal y hacer que el comando siga funcionando. Como ejemplo puse algún comando en commandscript.sh

seleccionarscript.sh:

#!/bin/bash
# Bash Menu Script Example

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2 HEXDUMP"
            nohup bash commandscript.sh 
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

comandoscript.sh:

#!/bin/bash
exec hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random &

información relacionada