Estou tentando escrever um bash
script para abrir determinados arquivos (principalmente arquivos PDF) usando o gnome-open
comando Também quero que o terminal saia assim que abrir o arquivo pdf.
Eu tentei adicionar exit
no final do meu script, no entanto, isso não fecha o terminal. Eu tentei procurar online uma resposta para minha pergunta, mas não consegui encontrar uma adequada, eu realmente apreciaria se vocês pudessem ajudar.
Preciso de uma resposta que mate apenas o terminal a partir do qual 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.
command-line
bash
scripts
Rumesh
fonte
fonte
gnome-open
porxdg-open
no meu script, mas não há alterações. O ainda o terminal permanece abertoRespostas:
Se você estiver abrindo apenas um arquivo, não precisará realmente usar um script, porque um script deve ser uma maneira fácil de executar vários comandos em uma linha, enquanto aqui você só precisa executar dois comandos (incluindo
exit
) .Se você deseja executar
exit
após um comando ou após uma cadeia de comandos, pode encadeá-lo ao que já possui usando o&&
operador (que, com sucesso do comando / cadeia de comandos anterior, executará o próximo comando) ou usando o comando;
operador (que, com êxito e com falha do comando / cadeia de comandos anterior, executará o próximo comando).Nesse caso, seria algo assim:
* <path_to_pfd_file> = caminho do arquivo pdf
exit
colocar no final de um script não funciona porque sai dabash
instância em que o script é executado, que é outrabash
instância que não abash
instância interna do Terminal .Se você deseja usar um script de qualquer maneira, a maneira mais direta é chamar o script da seguinte maneira:
Ou se o script estiver no diretório de trabalho atual do Terminal, da seguinte maneira:
Se você realmente não quer / não pode fazer isso, a segunda maneira mais direta é adicionar esta linha no final do seu script:
Isso enviará um
SIGKILL
sinal para o processo pai do script (abash
instância vinculada ao Terminal). Se apenas umabash
instância estiver vinculada ao Terminal, essa interrupção fará com que o Terminal se feche. Se váriasbash
instâncias estiverem vinculadas ao Terminal, a eliminação não fará com que o Terminal se feche.fonte
SIGTERM
aqui não é suficiente.Este script finaliza o terminal e, portanto, o shell e ele próprio.
Sem piedade, mata 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 esses forem processos filhos
gnome-terminal-server
, todos os terminais serão eliminados.Nesse caso, o script deve ser iniciado em um terminal independente, por exemplo
xterm
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, nesse caso, a janela do terminal
<your_command> & disown
No shell bash, o comando disown builtin é usado para remover trabalhos da tabela de trabalhos ou para marcar trabalhos para que um sinal SIGHUP não seja enviado a eles se o shell pai o receber (por exemplo, se o usuário fizer logout).
awk '{print $4}' "/proc/$PPID/stat"
Obtém o valor da quarta coluna do arquivo
/proc/$PPID/stat
(por exemplo/proc/1/stat
, retorna 0)fonte
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Você pode usar .
exec ./your-script
Um emulador de terminal como o GNOME Terminal é encerrado quando o processo inicial em execução nele - que geralmente é um shell - termina.
Se você já está em um terminal e a única coisa que deseja fazer antes de sair desse terminal é executar um script (ou programa) específico, isso significa que você não precisa mais do shell que está sendo executado nele. Assim, você pode usar o
exec
builtin do shell para fazer com que o shell se substitua pelo processo criado por seu comando.exec
.A sintaxe é , por exemplo ,.
exec command
exec ./your-script
exec
: um exemploPor exemplo, suponha que eu tenha um script de shell chamado
count
, marcado como executável e localizado no diretório atual. Contém:E, em um terminal, eu corro:
Isto imprime o numerais
5
,4
,3
,2
, e1
, por um segundo, e em seguida, os terminais fecha a janela.Se você executar isso a partir de algo diferente do primeiro processo executado no seu terminal - por exemplo, se você executou
bash
primeiro para iniciar outra instância do shell - isso o levará de volta ao shell que criou esse processo, em vez de sair do terminal. (Esta ressalva se aplica igualmente aexit
métodos baseados em).Você pode usar .
./your-script; exit
Se você não quiser dizer ao seu shell para substituir-se pelo novo processo (via
exec
), você pode pedir para ele permanecer, mas sair imediatamente após o término do novo processo.Para fazer isso, execute seu comando e o
exit
comando, 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 notar que isso se parece com o método sugerido nas respostas de kos e heemayl . A diferença é que:
./your-script && exit
&&
executa o segundo comando somente se o primeiro comando relatou que obteve êxito retornando um código de saída zero.;
executa o segundo comando, independentemente de o primeiro comando ter relatado ou não sucesso.Qual você deseja 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? Se sim, use
&&
; caso contrário, use;
.Também existe
command || exit
, que fecha o shell de chamada apenas se houver falhacommand
relatada .fonte
Você pode fonte seu script em vez de executá-lo, por exemplo
fonte
Pessoalmente, eu executaria o comando para abrir pdf ou outros arquivos em subshell, colocaria um atraso para permitir a abertura dos arquivos e depois sairia. Basicamente, aqui está o que eu testei
(nohup gnome-open *.pdf &); sleep 2; exit
Variação sobre isso seria
nohup gnome-open *.pdf && sleep 2 && exit
fonte
nohup
ignora o sinal de desligamento,nohup xdg-open some_program
funcionou para mim eexit
foi desnecessário.nohup
redireciona a mensagem para umnohup.out
arquivo:nohup: ignoring input and appending output to nohup.out
A solução mais simples seria:
Ao contrário de outro comando semelhante,
nohup
não é necessário para fazer com que o comando seja ignoradoSIGHUP
, o motivoxdg-open
será que você gerará um processo filho, que é o aplicativo preferido para abrir o arquivo pdf. Como o processo real iniciado no terminal não está mais lá para ser morto,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ída0
($?=0
) eexit
simplesmente fecha o terminal.fonte
exit
no final e não funcionou ..exit
dentro do script, o que é inútil, pois tem o efeito de sair dabash
instância em que o script está sendo executado, e não dabash
instância pai (aquela vinculada ao Terminal), que faria com que o Terminal fosse fechadoxdg-open
já é executado em segundo plano e desvinculado do Terminal, portanto, você não precisanohup
aqui, além do que eu entendo, o OP é executadoxdg-open
várias vezes dentro de um script para abrir vários arquivos em lote, usandoxdg-open
assim dentro do script causaria o script sair na primeiraxdg-open
ocorrênciaxdg-open
no backgr, mesmo que eu tivessenohup
por um motivo diferente e deve estar lá .. qualquer processo em segundo plano do terminal de origem será morto quando você matar o terminal pai ..nohup
existe para impedir it..como não preciso usar o terminal interativamente novamente, não há necessidade de colocar o processo em bg .. no seu segundo ponto que também pode ser evitado executando cadaxdg-open && exit
um em uma subshell ..Para responder explicitamente à pergunta do título,
"Saia do terminal depois de executar um script bash" :
Execute apenas seu script no terminal
Sem examinar os detalhes do que o script faz, 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 e:Use a opção
-x
(--execute
) quando desejar fornecer argumentos para o script. Com isso, apenas todo o restante da linha de comando é tomado como comando e argumentos.Se o seu script sair, não haverá um shell interativo que aguente qualquer coisa, aguardando a entrada do usuário.
Exemplos
O teminal sairá após o comando em execução sair - assim, o fechamento após a
sleep
execução de 4 segundos, sem shell:Obviamente, você ainda pode usar scripts de shell, porque seu script está usando uma instância de shell diferente de qualquer maneira.
Além disso, você pode executar um shell com um script explícito - ele não será interativo:
fonte