Como posso executar um comando e sair imediatamente do terminal?

Como posso executar um comando e sair imediatamente do terminal?

Deve ficar bem claro o que estou tentando fazer:

script original.sh:

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

Coisas bem básicas. O problema surge quando tento o seguinte:

> xterm -e 'script.sh'

script.sh funciona bem quando chamado de um shell. Mas quando tento chamá-lo do fvwm, não vejo resultados de " cmd $blah". Tentar a seguinte modificação não faz nada para mim:

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

Como posso alcançar a funcionalidade desejada? (ou seja, como posso fazer um xterm aparecer por tempo suficiente para fazer uma seleção e depois se matar enquanto um comando é executado em segundo plano?)

Responder1

Você pode adicionar como última linha do seu script umespere PIDinstrução com PIDo comando de fundo que você está interessado, ela será concluída. Claro que você precisa armazenar isso PIDno seu 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:

  • wait é um comando interno do shell.Ele espera que cada processo especificado seja concluído e retorne seu status de encerramento. Você pode consultar issoajuda.

Responder2

Será adequado para você executá-lo em uma nova xtermsessão e depois sair do terminal atual? Deve deixar o novo ainda funcionando.

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

EDITAR:

A abordagem abaixo permite que você execute o script da GUI no terminal, selecione o comando para executar, saia do terminal e tenha o comando ainda funcionando. Como exemplo coloquei algum comando em commandscript.sh

selectscript.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 &

informação relacionada