Como posso executar um comando e sair imediatamente do terminal?

2

Deve ficar bem claro o que estou tentando fazer:

original script.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 muito bem quando chamado de um shell. Mas quando tento chamá-lo de fvwm, não vejo resultados de " cmd $blah ". Tentando 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? (isto é, como eu posso fazer um xterm aparecer o tempo suficiente para eu fazer um select, então se matar enquanto um comando é executado em segundo plano?)

    
por user340098 01.07.2014 / 02:52

2 respostas

0

Você pode adicionar como a última linha do seu script uma instrução PID de espera com o PID do comando de segundo plano que você está interessado, que ele será concluído. Claro que você tem que armazenar PID no 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. Aguarda que cada processo especificado seja concluído e retorne seu status de encerramento. Você pode consultar esta ajuda
por 02.07.2014 / 12:22
1

Será mais adequado se você executá-lo em uma nova sessão xterm e, em seguida, sair do seu 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, deixar o terminal e ter 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

commandscript.sh:

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