Use xdg-open para abrir um URL com um novo processo

13

Estou começando a experimentar o Crunchbang (que é baseado no Debian e usa o terminator ) como um ambiente de desenvolvimento web, e uma das coisas com as quais estou lutando é o comportamento xdg-open. Eu venho de um background OSX, então me perdoe se essa pergunta parecer densa.

Eu gostaria de poder abrir um URL xdg-open http://www.google.come continuar usando a mesma janela do terminal para trabalhar (é assim que openfunciona no OSX). No momento, usar xdg-openocupa a guia / sessão atual até fechar a janela do navegador ou terminar manualmente as coisas ctrl + c. Eu preferiria que iniciasse um novo processo, para abrir uma URL, consultar os dados na página e usá-la na mesma guia / janela sem precisar abrir outra.

Nick Tomlin
fonte
Qual navegador da web você está usando?
Cristian Ciupitu 30/07/2014

Respostas:

11

Estranho, funciona assim imediatamente no meu Debian. Tente executá-lo em segundo plano:

xdg-open http://www.google.com &

Você pode transformar isso em uma função adicionando estas linhas ao seu ~/.bashrcarquivo:

function open () {
    xdg-open "$*" &
}

Você pode simplesmente executar open http://www.google.come ele será executado em segundo plano.

terdon
fonte
1
Isso funciona muito bem. Eu esperava ter um alias simples para open, (ex: open = 'xdg-open') existe uma maneira de obter a funcionalidade xdg-open <url> &sem usar uma função shell?
Nick Tomlin
@NickTomlin Não tanto quanto eu sei, não, mas o que você tem contra funções? Como você pode ver na minha resposta atualizada, é quase tão simples quanto um pseudônimo.
terdon
Não é um viés específico, esperava evitar uma função, pois estou tentando usar (e reutilizar) o mesmo alias para os sabores Mac OS e * nix.
Nick Tomlin
Não há razão para que você não possa. As funções dependem do shell, desde que você use o bash em todos os sistemas em questão, ele deve funcionar perfeitamente.
terdon
Também funciona imediatamente no Fedora 20.
Cristian Ciupitu 30/07/2014
7

Se você deseja desanexar o processo do shell atual em vez de iniciá-lo como um trabalho em segundo plano xdg-open http://www.google.com &, eu gosto do detachutilitário:

detach xdg-open http://www.google.com

Pode-se criar um alias para isso. Eu gosto detachmais de nohupcomo fecha stdin stdout e stderr por padrão, para que sua chamada seja mais limpa.

Dan D.
fonte
3
Infelizmente, detachparece não existir na minha distro. nohupinicia o processo, mas ainda ocupa a janela do terminal.
Nick Tomlin
detachtambém não está na minha distro; mas python pode lidar com abertura URLs e destacando: python -m webbrowser -t "http://example.com". Isso deve funcionar imediatamente em quase todas as distribuições um pouco recentes do linux.
Krets
Embora detachnem esteja no AUR, foi fácil instalar a partir do código-fonte e, além disso, foi o único programa que conseguiu o que eu queria. (as alternativas listadas aqui e no detachwebsite não permitem fechar o shell enquanto xdg-openestiver em execução, ou pelo menos detachnão fazer o meu shell reclamar um pouco)
rien333
4

xdg-openaguarda a conclusão do programa. Isso é por design. Se o programa for um modo de texto, ele deverá permanecer em primeiro plano no terminal. Mesmo que o programa seja da interface gráfica do usuário, esse comportamento é útil caso xdg-openseja usado em um script e o script queira executar alguma coisa após a edição do arquivo (por exemplo, envie a nova versão para algum lugar ou faça algo com a nova versão).

Se você não quiser esperar, corra xdg-openem segundo plano. Você pode executar qualquer comando shell em segundo plano colocando um e comercial no final.

xdg-open http://www.google.com &

Com alguns programas, xdg-openretorna imediatamente. O que acontece é que o programa que xdg-openchama retorna imediatamente. Isso geralmente acontece com os programas da GUI que abrem todos os arquivos em uma única instância: quando você os inicia pela segunda vez, eles enviam uma mensagem para a instância em execução para dizer para abrir o arquivo e sair imediatamente.

Gilles 'SO- parar de ser mau'
fonte
como esses aplicativos implementam a política de instância única? DBus é uma maneira que eu conheço, mas existe uma maneira 'xdg' de implementar isso?
PnotNP
@NulledPointer Bloqueie arquivos, mensagens da janela X11, D-Bus, ... Suponho que o D-Bus seja o caminho Freedesktop “padrão”, mas não sei se existe uma especificação formal para isso.
Gilles 'SO- stop be evil'
2
No meu sistema Ubuntu 16.04, o xdg-open sempre retorna imediatamente. Para o meu aplicativo atual, eu realmente preferiria que ele bloqueie. Onde seu "xdg-open aguarda a conclusão do programa. Isso ocorre por design." informações vêm?
Charl Botha
O @CharlBotha xdg-openretorna imediatamente (posso confirmar isso no Ubuntu 16.04), mas o programa que ele chama pode se mover para o segundo plano. Por exemplo, no meu sistema, xdg-openchama o Evince para arquivos PDF; evince foo.pdfbloqueia até você fechar o arquivo PDF, a menos que o PDF já esteja aberto. Nesse caso, o segundo evinceprocesso iniciado por xdg-openfocaliza a instância existente e sai. xdg-opennão tem controle sobre isso, a menos que haja uma maneira de fazer o programa manter um processo em execução.
Gilles 'SO- stop be evil'
@ Gilles Eu acho que você não entendeu Charl Botha. Sua resposta declara "xdg-open aguarda a conclusão do programa. Isso ocorre por design.". Mas então seu comentário diz "xdg-open retorna imediatamente" ... que são contraditórios.
Cheshirekow
1

Ao combinar a resposta de terdon e a discussão de Dan D.,nohup criei uma função que faz exatamente o que eu quero:

  1. Abre o arquivo no aplicativo escolhido sem nenhuma gravação no terminal.
  2. Desanexa o processo para que a janela do terminal possa ser fechada.
  3. Não grava nenhum erro que o aplicativo produz no terminal.

Adicionei isso ao meu .bashrc/.zshrcarquivo:

function open () {
  nohup xdg-open "$*" > /dev/null 2>&1
}

Para uma explicação de /dev/null 2>&1ver esta discussão sobre ocultar stdoutestderr .

LondonRob
fonte
0

Tente o seguinte:

DISPLAY=:0.0; xdg-open '<url>'

Eu uso essa técnica para colocar na fila os URLs magnet: // no meu cliente Bit Torrent Vuze.

ssh someserver "DISPLAY=:0.0; xdg-open 'http://www.google.com/'"

As aspas simples ajudam a proteger o conteúdo dos URLs para que o shell não tente interpretá-los.

slm
fonte
Isso ainda mantém o processo em execução na janela atual do terminal. Informe-me se precisar esclarecer minha pergunta.
Nick Tomlin
Sim, se você deseja que o plano de fundo fique imediatamente em segundo plano, basta colocá-lo em segundo plano com um "e" comercial. Não é a resposta que @ terdon disse para fazer?
Slm
O problema aqui não é o xdg-open, veja a resposta do @Gilles, ele explica por que o xdg-open está sendo mantido, é a GUI para a qual você está enviando o URL para o qual o xdg-open está aguardando.
Slm
Para qual navegador você está enviando o URL? Existe uma caixa de diálogo ou qualquer outra coisa sendo exibida quando você envia os URLs com xdg-open? Parece que vários dos respondentes aqui indicaram que o comportamento normal é que o controle retorne ao terminal após algum período de tempo.
Slm
obrigado pelo esclarecimento. Analisei as respostas e entendo isso melhor agora. O navegador é iceweasal.
Nick Tomlin
0

Se você precisar abrir páginas da Web na linha de comando (loop), basta abrir o navegador antes de iniciar o script.

Nesse caso, ele não espera que o navegador seja fechado após o primeiro link, mas abre todos eles em novas guias.

Valentina Walx
fonte
0

Como hoje, nenhuma dessas opções funcionou para mim. Estou ciente de que o OP disse "use xdg-open", desculpe-me antecipadamente.

Acabei fazendo um simples simples chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Se você não possui nenhum desses três navegadores, sinta-se à vontade para usar os corretos com sua preferência de pedido.

Nota: O Firefox abriu uma nova janela sem adicionar nada. Caso não funcione sem costura para você, use firefox https://google.es -new-instance -new-window. Observe que é apenas um -para sinalizadores do Firefox.

m3nda
fonte
0

renegar é o comando certo para isso.

Eu uso 2 funções para isso, a fim de mantê-lo mais legível.

f_x()
{
   xdg-open "$1" &
   disown
}

x()
{
   f_x "$*" > /dev/null 2>&1
}
user352672
fonte
Você acredita que uma função que chama outra função é mais fácil de ler e entender do que uma única função com três linhas de comprimento?
G-Man diz 'Reinstate Monica'
disownnão impede que erros sejam enviados para o terminal.
LondonRob