Sair do terminal depois de executar um script bash

14

Estou tentando escrever um script bash para abrir determinados arquivos (principalmente arquivos pdf) usando o comando gnome-open . Eu também quero que o terminal saia assim que abrir o arquivo pdf.

Eu tentei adicionar exit ao final do meu script, mas isso não encerra o terminal. Eu tentei pesquisar on-line para obter uma resposta para a minha pergunta, mas não consegui encontrar nenhuma adequada, eu realmente agradeceria se vocês pudessem ajudar.

Eu preciso de uma resposta que só mata o terminal do qual eu executo o comando nem todos os terminais seriam possíveis? A resposta anterior que aceitei mata todas as janelas do terminal que estão abertas. Eu não sabia que era esse o caso até hoje.

    
por Rumesh 20.04.2015 / 15:28

7 respostas

10

Se você está abrindo apenas um arquivo, não precisa realmente usar um script, porque um script é uma maneira fácil de executar vários comandos em sequência, enquanto aqui você só precisa executar dois comandos (incluindo exit ).

Se você deseja executar exit após um comando ou depois de uma cadeia de comandos, você pode encadear com o que você já tem usando o operador && (que no sucesso do comando / cadeia de comandos anterior execute o próximo comando) ou usando o operador ; (que tanto no sucesso quanto na falha do comando / cadeia de comandos anterior executará o próximo comando).

Nesse caso, seria algo assim:

gnome-open <path_to_pdf_file> && exit

* < caminho_para_pfd_file > = caminho do arquivo pdf

exit colocado no final de um script não funciona porque ele apenas sai da instância bash na qual o script é executado, que é outra instância bash do que a instância interna bash do Terminal. / p>

Se você quiser usar um script de qualquer maneira, a maneira mais direta é simplesmente chamar o script assim:

<path_to_script> && exit

Ou se o script estiver no diretório de trabalho atual do Terminal da seguinte forma:

./<script> && exit

Se você realmente não quiser / não puder fazer isso, a segunda maneira mais direta é adicionar essa linha ao final do script:

kill -9 $PPID

Isso enviará um sinal SIGKILL para o processo pai do script (a instância bash vinculada ao Terminal). Se apenas uma instância de bash estiver vinculada ao Terminal, a interrupção será interrompida pelo Terminal. Se várias instâncias bash estiverem vinculadas ao Terminal, a interrupção não fará com que o Terminal se feche.

    
por kos 20.04.2015 / 17:37
4

Este script termina o terminal e, portanto, o shell e ele mesmo.

Ele mata impiedosamente todos os processos. Se você tiver várias guias abertas em um terminal, elas também serão fechadas.

O problema é que, se vários terminais forem abertos e estes forem processos filhos de gnome-terminal-server , todos os terminais serão eliminados.

Neste caso, o script deve ser iniciado em um terminal independente, por exemplo, xterm

<your_command> & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • PPID

    O PPID é o id do processo pai, neste caso o shell ( e.g. /bin/bash )

  • PPPID

    O PPPID é o ID do processo pai do PPID, neste caso, a janela do terminal

  • <your_command> & disown

    No bash shell, o comando disown builtin é usado para remover trabalhos da tabela de trabalhos, ou para marcar jobs de modo que um sinal SIGHUP não seja enviado a eles se o shell pai o receber (por exemplo, se o usuário efetuar logout) .

  • awk '{print $4}' "/proc/$PPID/stat"

    Obtém o valor da quarta coluna do arquivo /proc/$PPID/stat (por exemplo, para /proc/1/stat , retorna 0)

por A.B. 20.04.2015 / 15:45
2

Você pode usar exec ./your-script .

Um emulador de terminal como o GNOME Terminal é encerrado quando o processo inicial é executado dentro dele - que geralmente é um shell - encerrado.

Se você já está em um terminal e a única coisa que você quer fazer antes de sair desse terminal é executar um script (ou programa) específico, isso significa que você não precisa mais mais do shell que está sendo executado nele. Assim, você pode usar o exec builtin do shell para fazer o shell substituir-se pelo processo criado pelo seu comando.

  • No caso do seu script, esse é outro processo shell - assim como um processo shell second é criado quando você executa um script sem exec .

A sintaxe é exec command , por exemplo, exec ./your-script .

exec : um exemplo

Por exemplo, suponha que eu tenha um script de shell chamado count , marcado como executável e localizado no diretório atual. Contém:

#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done

E, em um terminal, eu corro:

exec ./count

Isso imprime os numerais 5 , 4 , 3 , 2 e 1 , um por segundo e, em seguida, a janela do terminal é fechada.

Se você executar isso de algo diferente do primeiro processo executado em seu terminal - por exemplo, se você executou bash primeiro para iniciar outra instância de shell -, isso o levará de volta ao shell que criou esse processo, em vez de sair do terminal. (Esta ressalva aplica-se igualmente aos métodos baseados em exit .)

Você pode usar ./your-script; exit .

Se você não quer dizer ao seu shell para se substituir com o novo processo (via exec ), você pode dizer a ele para ficar por perto, mas se fechar imediatamente após o novo processo terminar.

Para fazer isso, execute seu comando e o comando exit , separados por ; para que possam ser fornecidos em uma linha.

A sintaxe é command; exit , por exemplo, ./your-script; exit .

command; exit vs. command && exit

Você pode perceber que isso é semelhante ao método ./your-script && exit sugerido em kos e heemayl's responde. A diferença é que:

  • && executa o segundo comando somente se o primeiro comando informou que teve êxito retornando um código de saída igual a zero.
  • ; executa o segundo comando, independentemente de o primeiro comando ter relatado sucesso ou não.

Qual deles você quer depende da situação específica. Se o comando falhar, você deseja que o shell de chamada (e o terminal de hospedagem) permaneça ativo? Em caso afirmativo, use && ; se não, use ; .

Há também command || exit , que encerra o shell de chamada somente se command relatou falha .

    
por Eliah Kagan 10.05.2015 / 18:11
1

A solução mais simples seria:

xdg-open file.pdf && exit

Ao contrário de outros comandos similares nohup não é necessário para fazer o comando ignorar SIGHUP , a razão sendo xdg-open sairá gerando um processo filho que é o aplicativo preferido para abrir o arquivo pdf. Como o processo real iniciado a partir do terminal não está mais lá para ser eliminado, nohup não é necessário.

&& indica que o próximo comando será executado se o comando anterior for bem-sucedido, ou seja, retorna o código de saída 0 ( $?=0 ) e exit simplesmente fechará o terminal.

    
por heemayl 20.04.2015 / 18:07
1

Você pode criar seu script em vez de executá-lo, por exemplo,

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
    
por RiaD 21.04.2015 / 01:19
0

Pessoalmente, eu iria executar o comando para abrir pdf ou outros arquivos em subshell, colocar um atraso para deixar os arquivos abertos e, em seguida, sair. Basicamente, aqui está o que testei (nohup gnome-open *.pdf &); sleep 2; exit

A variação disso seria nohup gnome-open *.pdf && sleep 2 && exit

    
por Sergiy Kolodyazhnyy 22.04.2015 / 09:05
0

Para responder explicitamente à pergunta do título,

"Sair do terminal depois de executar um script bash" :

Execute apenas o seu script no terminal

Sem olhar os detalhes do script, um script pode ser executado diretamente dentro de um terminal com a opção -e ( --command ), sem iniciar um shell - ele é usado no lugar do shell:

gnome-terminal -e ./script.sh

Use a opção -x ( --execute ) quando quiser fornecer argumentos ao script. Com isso, todo o restante da linha de comando é tomado como comando e argumentos.

gnome-terminal -x ./script.sh foo bar

Se o seu script sair, não haverá um shell interativo que aguente qualquer coisa aguardando a entrada do usuário.

Exemplos

O teminal apenas sairá após o comando em execução sair - assim, fechando após sleep ter executado 4 segundos, sem shell:

gnome-terminal -x sleep 4

Claro, você pode usar scripts de shell, porque seu script está usando uma instância de shell diferente.

Além disso, você pode executar um shell com um script explícito - ele não será interativo:

gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"
    
por Volker Siegel 10.05.2015 / 17:19