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.


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.


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.


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.


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 .


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.


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.


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.


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
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.