Estou tentando realizar o seguinte:
- abra um terminal gnome a partir do atalho do teclado, diga Ctrl+Shift+E.
- Execute um comando no terminal. Para concreto, o comando é
gio open $(fzf)
. O comando é interativo e inicia programas externos (como evince). - Assim que o programa externo for iniciado, feche o terminal sem fechar o programa externo.
O comando que me interessa para a etapa 2 acima é gio open $(fzf)
: eu seleciono um arquivo usando o fuzzy finder fzf
e, em seguida, o comando gio open
abre esse arquivo com o programa padrão do gnome.
Posso executar as três etapas acima, uma por uma:
- Posso vincular um atalho de teclado nas configurações a
gnome-terminal
: Ele abre um terminal conforme o esperado. - Então eu digito no terminal recém-aberto meu comando
gio open $(fzf)
: Se eu selecionar um arquivo pdf defzf
, ele abre o evince com o arquivo selecionado. - Posso digitar Ctrl+D para fechar o terminal. Fazer isso faznãoevidência próxima. Este é o comportamento pretendido.
e executar essas três etapas manualmente funciona.
Meu objetivo é automatizar o acima.Deve funcionar da seguinte maneira. Conforme digito o atalho de teclado Ctrl+Shit+E (ou qualquer outro), um terminal gnome deve abrir e o comando gio open $(fzf)
deve ser executado. Assim que o comando interativo for executado (que abre um programa externo como o evince), o terminal deverá fechar automaticamente sem fechar o evince.
O que eu tentei.
- Adicionar um atalho de teclado com o comando
gnome-terminal -- bash -c "gio open $(fzf)"
não funciona. Pressionar a combinação de teclas não faz nada. - Se eu adicionar o comando
gio open $(fzf)$
no final do meu .bashrc, um atalho de teclado com o comandognome-terminal
abre o terminal e o comando é executado. Assim que eu seleciono um arquivo pdf, o evince é aberto com o arquivo selecionado (sim!!!). Mas então, se eu pressionar Ctrl+D, o terminal fecha e o evince também (talvez porque o evince seja um subprocesso?). - Se eu adicionar o comando
gio open $(fzf)$ && exit
no final do meu .bashrc, um atalho de teclado com o comandognome-terminal
abre o terminal e o comando é executado, mas assim que eu seleciono um arquivo, o terminal fecha sem abrir o evince (o evince pode ter iniciado e obtido fechado imediatamente, não sei dizer).
Observe que brincar com .bashrc foi principalmente para fins de teste. Gostaria de evitar poluir meu .bashrc.
Responder1
Mas então, se eu pressionar Ctrl+D, o terminal fecha e o evince também (talvez porque o evince seja um subprocesso?)
Sim, claro, é um subprocesso e você deve executar esse processo como "desanexado". Depois disso você pode finalizar o processo principal (no seu caso - terminal).
Aqui está uma resposta detalhada sobre como executar processos desanexados.
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
Outra forma de usar o próximo atalho:
bash -c "some_command" > /dev/null &2>&1
Neste caso, a janela do terminal não será levantada e você não precisa adicionar nada ao seu arquivo .bashrc.
Responder2
A mesma coisa estava me incomodando, então responderei a essa velha pergunta. Eu descobri isso xdg-open
e gio open
tenho problemas com esse tipo de script, e também notei que o gnome-terminal tem problemas com ele. Por exemplo, o xdg-open pode abrir o gedit para editar arquivos de texto, mas não o evince para visualizar PDFs. Então eu uso o seguinte script com xterm -e
. Observe que isso deixará os arquivos nohup.out em seu diretório inicial. Você pode redirecionar o stdout se isso o incomodar.
#!/bin/bash
file="$(fzf)"
[ - n "$file" ] || exit 1
end="${file##*.}"
case $end in
pdf | djvu | ps )
exec nohup evince "$file"
;;
* )
exec nohup xdg-open "$file"
;;
esac