Bir URL'yi yeni bir işlemle açmak için xdg-open kullanın


13

Bir web geliştirme ortamı olarak Crunchbang (Debian tabanlı ve sonlandırıcı kullanır ) ile denemeye başlıyorum ve mücadele ettiğim şeylerden biri de davranışı xdg-open. Bir OSX geçmişinden geliyorum, bu yüzden bu soru yoğun olarak ortaya çıkarsa beni affet.

Ben bir url ile açmak xdg-open http://www.google.comve daha sonra çalışmak için aynı terminal penceresini kullanmaya devam etmek istiyorum ( openOSX nasıl çalışır). Şu anda, xdg-opentarayıcı penceresini kapatana veya bir şeyleri elle bitene kadar geçerli sekmeyi / oturumu kullanıyor ctrl + c. Yeni bir işlem başlatmasını tercih ederim, bu şekilde bir URL açabilir, sayfadaki verilere başvurabilir ve ek bir tane açmaya gerek kalmadan aynı sekmede / pencerede kullanabilirim.


Hangi web tarayıcısını kullanıyorsunuz?
Cristian Ciupitu

Yanıtlar:


12

Tuhaf, Debian'ımın kutusundan çıktığı gibi çalışıyor. Arka planda çalıştırmayı deneyin:

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

~/.bashrcDosyanıza şu satırları ekleyerek bunu bir işleve yapabilirsiniz :

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

Daha sonra basitçe çalıştırabilirsiniz open http://www.google.comve arka planda çalışır.


1
Harika çalışıyor. Ben open, (yani open = 'xdg-open') için basit bir takma sahip umuyordum xdg-open <url> &bir kabuk işlevi kullanmadan işlevselliği almak için bir yol var mı?
Nick Tomlin

@NickTomlin Bildiğim kadarıyla değil, hayır, ama işlevlere karşı neyiniz var? Güncellenmiş cevabımda görebileceğiniz gibi, neredeyse bir takma ad kadar basit.
terdon

Belirli bir önyargı değil, hem Mac OS hem de * nix lezzetleri için aynı takma adı kullanmaya (ve yeniden kullanmaya) çalıştığım için bir işlevden kaçınmayı umuyordum.
Nick Tomlin

Yapamaman için bir sebep yok. İşlevler kabuğa bağlıdır, söz konusu tüm sistemlerde bash kullandığınız sürece, mükemmel bir şekilde çalışması gerekir.
terdon

Fedora 20'deki kutudan da çıkıyor.
Cristian Ciupitu

7

Süreci bir arka plan işi olarak başlatmak yerine geçerli kabuktan ayırmak istiyorsanız xdg-open http://www.google.com &, detachyardımcı programı beğendim :

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

Bunun için bir takma ad oluşturulabilir. Sevdiğim detachüzerinde nohuponun çağırma temizleyici böylece varsayılan olarak kapanır Stdin stdout ve stderr olarak.


3
Ne yazık ki, detachbenim dağıtımımda var gibi görünmüyor. nohupişlemi başlatır, ancak yine de terminal penceresini işgal eder.
Nick Tomlin

detachbenim dağıtımımda da değil; ancak piton URL'leri açıp ayrılması işleyebilir: python -m webbrowser -t "http://example.com". Bu, neredeyse biraz yeni linux dağıtımlarında kullanıma hazır olmalıdır.
Krets

Her ne kadar detachAUR bile değil, kaynağından yüklemek kolaydır kanıtladı ve dahası ne istediğini elde tek programdı. (burada ve detachweb sitesinde listelenen alternatifler , olduğu sürece kabuğun kapatılmasına izin vermez xdg-openveya en azından detachkabuğumu bir bit şikayet etmedi)
rien333 13:18

4

xdg-openprogramın bitmesini bekler. Bu tasarım gereğidir. Program bir metin modu programı ise, terminalde ön planda kalmalıdır. Program bir GUI olsa bile, bu davranış xdg-openbir komut dosyasından kullanılıyorsa ve komut dosyası dosya düzenlendikten sonra bir şey yapmak istiyorsa yararlıdır (örn. Yeni sürümü bir yere gönderin veya başka bir şekilde yeni sürümle bir şey yapın).

Beklemek istemiyorsanız xdg-open, arka planda çalıştırın . Sonuna bir ve işareti koyarak arka planda herhangi bir kabuk komutunu çalıştırabilirsiniz.

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

Bazı programlarda xdg-openhemen geri döner. Gerçekte olan şey, xdg-opençağıran programın hemen geri dönmesidir. Bu genellikle, tüm dosyaları tek bir durumda açan GUI programlarında olur: ikinci kez başlattığınızda, çalışan örneği dosyayı açmasını ve hemen çıkmasını bildiren bir ileti gönderir.


bu tür uygulamalar nasıl tek örnekli politika uygular? DBus bildiğim bir yolu var ama bunu uygulamak 'xdg' yolu var mı?
Mayıs

@NulledPointer Kilit dosyaları, X11 pencere mesajları, D-Bus,… Sanırım D-Bus “standart” Freedesktop yolu ama bunun resmi bir özelliği olup olmadığını bilmiyorum.
Gilles 'SO- kötü olmayı kes'

2
Ubuntu 16.04 sistemimde xdg-open daima hemen geri döner. Mevcut uygulama için, aslında engellemesini tercih ederim. "Xdg-open programınızın bitmesini bekliyor. Bu tasarım gereğidir." bilgi nereden geliyor?
Charl Botha

@CharlBotha xdg-openhemen geri döner (Ubuntu 16.04'te onaylayabilirim), ancak çağırdığı program arka plana geçebilir. Örneğin, sistemimde xdg-openEvince'yi PDF dosyaları için çağırır; PDF zaten açık değilseevince foo.pdf PDF dosyasını kapatana kadar engeller , bu durumda ikinci işlem varolan örneği odaklar ve çıkar. programın çalışır durumda kalmasını sağlamanın bir yolu olmadığı sürece bunun üzerinde hiçbir kontrolü yoktur. evincexdg-openxdg-open
Gilles 'SO- kötü olmayı kes'

@Gilles Sanırım Charl Botha'yı yanlış anladın. Cevabınız "xdg-open programın bitmesini bekliyor. Bu tasarım gereğidir." Ama sonra yorumunuz "xdg-open hemen döner" der ... ki bu çelişkilidir.
cheshirekow

1

Terdon'un cevabını ve Dan D.'nin tartışmasınınohup birleştirerek tam olarak istediğimi yapan bir fonksiyon yarattım:

  1. Olmadan seçilen uygulamasında dosyayı açar herhangi tüm terminal yazılı.
  2. Terminal penceresinin kapatılabilmesi için işlemi ayırır.
  3. Uygulamanın terminale ürettiği herhangi bir hata yazmaz.

Bunu dosyama ekledim .bashrc/.zshrc:

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

Bir bir açıklamasını için /dev/null 2>&1bkz gizleme hakkında bu tartışmayı stdoutvestderr .


0

Bunu dene:

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

Bu tekniği Bit Torrent istemcim Vuze'ye mıknatıs: // URL'leri sıralamak için kullanıyorum.

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

Tek tırnak, URL'lerin içeriğini korumaya yardımcı olur, böylece kabuk bunları yorumlamaya çalışmaz.


Bu, işlemin geçerli terminal penceresinde hala çalışmasını sağlar. Sorumu açıklığa kavuşturmam gerekip gerekmediğini bana bildirin.
Nick Tomlin

Evet, hemen arka plana gitmesini istiyorsanız, sadece "&" işareti ile arka plana koyun. Bu @ terdon'un cevabının söylediği bir şey değil mi?
slm

Buradaki sorun xdg-open değil, @Gilles cevabına bakın, xdg-open'ın neden bekletildiğini açıklıyor, xdg-open'ın beklemesine neden olan URL'yi gönderdiğiniz GUI.
slm

URL'yi hangi tarayıcıya gönderiyorsunuz? URL'leri w / gönderdiğinizde açılan bir iletişim kutusu veya başka bir şey var xdg-openmı? Buradaki cevapların birçoğu, normal davranışın, kontrolün bir süre sonra terminale geri döndüğünü belirtmiş gibi görünüyor.
slm

açıklama için teşekkürler. Cevapları inceledim ve şimdi daha iyi anlıyorum. Tarayıcı geri dönüşümlüdür.
Nick Tomlin

0

Web sayfalarını komut satırından (döngü) açmanız gerekirse, komut dosyasını başlatmadan önce tarayıcıyı açmanız yeterlidir.

Bu durumda, ilk bağlantıdan sonra tarayıcının kapatılmasını beklemez, ancak hepsini yeni sekmelerde açar.


0

Bugün olduğu gibi, bu seçeneklerin hiçbiri benim için çalışmadı. Ben OP tamamen "üzgünüm xdg-open" dedi önceden farkında üzgünüm.

Sonunda bir ölü-basit yaptım chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Bu 3 tarayıcıdan herhangi birine sahip değilseniz, sipariş tercihinizle doğru olanları kullanmaktan çekinmeyin.

Not: Firefox hiçbir şey eklemeden yeni bir pencere açtı. Dava senin için dikişsiz çalışmıyor, kullan firefox https://google.es -new-instance -new-window. -Firefox bayrakları için sadece bir tane olduğunu unutmayın .


0

reddetme bunun için doğru komuttur.

Daha okunabilir olmasını sağlamak için bunun için 2 işlev kullanıyorum.

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

x()
{
   f_x "$*" > /dev/null 2>&1
}

Ne, başka bir işlevi çağıran bir fonksiyonun okunması ve anlaşılmasının üç satır uzunluğundaki tek bir fonksiyondan daha kolay olduğuna inanıyor musunuz?
G-Man

disownterminale hata gönderilmesini engellemez.
LondonRob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.