Gunakan xdg-open untuk membuka url dengan proses baru


13

Saya mulai bereksperimen dengan Crunchbang (yang didasarkan pada Debian, dan menggunakan terminator ) sebagai lingkungan pengembangan web, dan salah satu hal yang saya perjuangkan adalah perilaku xdg-open. Saya berasal dari latar belakang OSX, jadi maafkan saya jika pertanyaan ini menjadi padat.

Saya ingin dapat membuka url dengan xdg-open http://www.google.comdan kemudian terus menggunakan jendela terminal yang sama untuk bekerja (begitulah openfungsi di OSX). Saat ini, menggunakan xdg-openmenempati tab / sesi saat ini sampai saya menutup jendela browser, atau mengakhiri secara manual dengan ctrl + c. Saya lebih suka memulai proses baru, dengan cara itu saya bisa membuka URL, merujuk ke data pada halaman, dan menggunakannya di tab / jendela yang sama tanpa perlu membuka yang lain.


Browser web apa yang Anda gunakan?
Cristian Ciupitu

Jawaban:


11

Aneh, kerjanya seperti itu di luar kotak pada Debian saya. Coba jalankan di latar belakang:

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

Anda dapat menjadikan ini sebagai fungsi dengan menambahkan baris-baris ini ke ~/.bashrcfile Anda :

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

Anda kemudian bisa menjalankan open http://www.google.comdan menjalankannya di latar belakang.


1
Ini sangat bagus. Saya berharap memiliki alias sederhana untuk open, (yaitu open = 'xdg-open') apakah ada cara untuk mendapatkan fungsionalitas xdg-open <url> &tanpa menggunakan fungsi shell?
Nick Tomlin

@NickTomlin Tidak sejauh yang saya tahu, tidak, tapi apa yang Anda dapatkan dari fungsi? Seperti yang Anda lihat dalam jawaban saya yang diperbarui, ini hampir sesederhana alias.
terdon

Bukan bias tertentu, saya berharap untuk menghindari fungsi karena saya mencoba menggunakan (dan menggunakan kembali) alias yang sama untuk kedua Mac OS dan * nix rasa.
Nick Tomlin

Tidak ada alasan mengapa Anda tidak bisa. Fungsinya tergantung pada shell, selama Anda menggunakan bash di semua sistem yang dipermasalahkan itu harus bekerja dengan baik.
terdon

Ini bekerja di luar kotak pada Fedora 20 juga.
Cristian Ciupitu

7

Jika Anda ingin melepaskan proses dari shell saat ini daripada memulai sebagai pekerjaan latar belakang xdg-open http://www.google.com &, saya suka detachutilitas:

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

Orang bisa membuat alias untuk ini. Saya suka detachlebih nohupsebagai menutup stdin stdout dan stderr secara default sehingga doa yang lebih bersih.


3
Sayangnya, detachsepertinya tidak ada di distro saya. nohupmeluncurkan proses, tetapi masih menempati jendela terminal.
Nick Tomlin

detachjuga tidak ada di distro saya; tapi python dapat menangani membuka URL dan memisahkan: python -m webbrowser -t "http://example.com". Ini seharusnya bekerja di luar kotak pada hampir semua distro linux yang agak baru.
Krets

Meskipun detachbahkan tidak di AUR, terbukti mudah untuk menginstal dari sumber dan selanjutnya adalah satu-satunya program yang mencapai apa yang saya inginkan. (alternatif yang tercantum di sini dan di detachsitus web tidak memungkinkan menutup shell selama xdg-openberjalan, atau setidaknya detachtidak membuat shell saya mengeluh sedikitpun)
rien333

4

xdg-openmenunggu program selesai. Ini dengan desain. Jika program tersebut adalah program mode teks, ia harus tetap berada di latar depan di terminal. Sekalipun program ini adalah GUI, perilaku ini bermanfaat jika xdg-opendigunakan dari skrip dan skrip ingin melakukan sesuatu setelah file diedit (mis. Mengirim versi baru ke suatu tempat atau membuat sesuatu dengan versi baru).

Jika Anda tidak ingin menunggu, jalankan xdg-opendi latar belakang. Anda dapat menjalankan perintah shell di latar belakang dengan meletakkan tanda ampersand di bagian akhir.

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

Dengan beberapa program, xdg-opensegera kembali. Apa yang terjadi sebenarnya adalah bahwa program yang xdg-openmemanggil kembali segera. Ini biasanya terjadi dengan program GUI yang membuka semua file dalam satu contoh: ketika Anda memulai mereka kedua kalinya, mereka mengirim pesan instance yang berjalan untuk memberitahu itu untuk membuka file, dan segera keluar.


bagaimana aplikasi semacam itu menerapkan kebijakan satu contoh? DBus adalah salah satu cara saya tahu tetapi apakah ada cara 'xdg' untuk mengimplementasikan ini?
PnotNP

@NulledPointer Lock file, pesan jendela X11, D-Bus, ... Saya kira D-Bus adalah cara "standar" Freedesktop tapi saya tidak tahu apakah ada spesifikasi formal untuk ini.
Gilles 'SANGAT berhenti menjadi jahat'

2
Di sistem Ubuntu 16.04 saya, xdg-open selalu kembali dengan segera. Untuk aplikasi saya saat ini, saya sebenarnya lebih suka itu memblokir. Di mana "xdg-open Anda menunggu program selesai. Ini adalah desain." informasi berasal?
Charl Botha

@CharlBotha xdg-opensegera kembali (saya dapat mengonfirmasi bahwa pada Ubuntu 16.04), tetapi program yang diminta dapat pindah ke latar belakang. Misalnya, di sistem saya, xdg-openpanggil Evince untuk file PDF; evince foo.pdfblok sampai Anda menutup file PDF, kecuali PDF sudah terbuka, dalam hal ini evinceproses kedua dimulai dengan xdg-openmemfokuskan instance dan keluar yang ada. xdg-opentidak memiliki kendali atas hal itu, kecuali ada cara untuk membuat program tetap menjalankan proses.
Gilles 'SANGAT berhenti menjadi jahat'

@Gilles, saya pikir Anda salah paham tentang Charl Botha. Jawaban Anda menyatakan "xdg-open menunggu program selesai. Ini adalah desain.". Tetapi kemudian komentar Anda mengatakan "xdg-open segera kembali" ... yang bertentangan.
cheshirekow

1

Dengan menggabungkan jawaban terdon dan diskusi Dan D. tentangnohup saya membuat fungsi yang melakukan persis apa yang saya inginkan:

  1. Membuka file dalam aplikasi yang dipilih tanpa setiap menulis ke terminal sama sekali.
  2. Lepaskan proses sehingga jendela terminal dapat ditutup.
  3. Tidak menulis kesalahan apa pun yang dihasilkan aplikasi ke terminal.

Saya menambahkan ini ke .bashrc/.zshrcfile saya :

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

Untuk penjelasan tentang /dev/null 2>&1lihat diskusi ini tentang persembunyian stdoutdanstderr .


0

Coba ini:

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

Saya menggunakan teknik ini untuk en-antrian magnet: // URL ke klien Bit Torrent saya Vuze.

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

Kutipan tunggal membantu melindungi konten URL sehingga shell tidak berusaha menafsirkannya.


Ini masih membuat proses berjalan di jendela terminal saat ini. Beri tahu saya jika saya perlu mengklarifikasi pertanyaan saya.
Nick Tomlin

Ya, jika Anda ingin latar belakang langsung maka cukup letakkan di latar belakang dengan ampersand "&". Bukankah itu jawaban @ terdon yang dikatakan harus dilakukan?
slm

Masalahnya di sini bukan xdg-open, lihat jawaban @Gilles, ia menjelaskan mengapa xdg-open ditahan, ini adalah GUI yang Anda kirim URL yang menyebabkan xdg-open menunggu.
slm

Peramban apa Anda mengirim URL? Apakah ada kotak dialog atau apa pun yang muncul ketika Anda mengirim URL dengan / xdg-open? Sepertinya beberapa penjawab di sini telah menunjukkan bahwa perilaku normal adalah bahwa kontrol dikembalikan ke terminal setelah beberapa periode waktu.
slm

terimakasih atas klarifikasinya. Saya sudah memeriksa jawabannya dan sekarang saya mengerti ini dengan lebih baik. Browser adalah iceweasal.
Nick Tomlin

0

Jika Anda perlu membuka halaman web dari command line (loop), Anda bisa membuka browser sebelum memulai skrip.

Dalam hal ini tidak menunggu browser ditutup setelah tautan pertama, tetapi membuka semuanya di tab baru.


0

Seperti hari ini, tidak satu pun dari opsi itu yang bekerja untuk saya. Saya sepenuhnya sadar bahwa OP mengatakan "use xdg-open", maaf sebelumnya.

Saya akhirnya melakukan yang sederhana-mati chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es.

Jika Anda tidak memiliki salah satu dari ketiga browser tersebut, silakan gunakan yang benar dengan preferensi pesanan Anda.

Catatan: Firefox membuka jendela baru tanpa menambahkan apa pun. Kasing tidak bekerja mulus untuk Anda, gunakan firefox https://google.es -new-instance -new-window. Perhatikan bahwa hanya satu -untuk bendera firefox.


0

tolak adalah perintah yang tepat untuk ini.

Saya menggunakan 2 fungsi untuk ini, agar lebih mudah dibaca.

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

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

Apa, Anda percaya bahwa fungsi yang memanggil fungsi lain lebih mudah dibaca dan dipahami daripada fungsi tunggal yang panjangnya tiga baris?
G-Man Mengatakan 'Reinstate Monica'

disowntidak mencegah kesalahan dikirim ke terminal.
LondonRob
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.