Sử dụng xdg-open để mở url với quy trình mới


13

Tôi đang bắt đầu thử nghiệm với Crunchbang (dựa trên Debian và sử dụng terminator ) làm môi trường phát triển web và một trong những điều tôi đang vật lộn là hành vi xdg-open. Tôi đến từ nền tảng OSX, vì vậy hãy tha thứ cho tôi nếu câu hỏi này xuất hiện dày đặc.

Tôi muốn có thể mở một url xdg-open http://www.google.comvà sau đó tiếp tục sử dụng cùng một cửa sổ đầu cuối để hoạt động (đó là cách các openchức năng trong OSX). Ngay bây giờ, việc sử dụng xdg-openchiếm tab / phiên hiện tại cho đến khi tôi đóng cửa sổ trình duyệt hoặc kết thúc mọi thứ bằng tay ctrl + c. Tôi rất thích nó bắt đầu một quy trình mới, theo cách đó tôi có thể mở URL, tham khảo dữ liệu trên trang và sử dụng nó trong cùng một tab / cửa sổ mà không cần phải mở thêm.


Bạn đang sử dụng trình duyệt web nào?
Cristian Ciupitu

Câu trả lời:


11

Thật kỳ lạ, nó hoạt động như thế ngoài hộp trên Debian của tôi. Hãy thử chạy nó trong nền:

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

Bạn có thể biến điều này thành một hàm bằng cách thêm các dòng này vào ~/.bashrctệp của mình :

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

Sau đó, bạn có thể chỉ cần chạy open http://www.google.comvà nó sẽ chạy trong nền.


1
Điều này làm việc tuyệt vời. Tôi đã hy vọng có một bí danh đơn giản để open, (ví dụ: open = 'xdg-open') có cách nào để có được chức năng xdg-open <url> &mà không cần sử dụng hàm shell không?
Nick Tomlin

@NickTomlin Không xa như tôi biết, không, nhưng bạn có gì chống lại các chức năng? Như bạn có thể thấy trong câu trả lời cập nhật của tôi, nó gần như đơn giản như một bí danh.
terdon

Không phải là một thiên vị cụ thể, tôi đã hy vọng tránh được một chức năng vì tôi đang cố gắng sử dụng (và sử dụng lại) cùng một bí danh cho cả hai hương vị Mac OS và * nix.
Nick Tomlin

Không có lý do tại sao bạn không thể. Các chức năng phụ thuộc vào trình bao, miễn là bạn sử dụng bash trong tất cả các hệ thống được đề cập thì nó sẽ hoạt động hoàn hảo.
terdon

Nó cũng hoạt động tốt trên Fedora 20.
Cristian Ciupitu

7

Nếu bạn muốn tách quá trình khỏi trình bao hiện tại thay vì bắt đầu nó như một công việc nền xdg-open http://www.google.com &, tôi thích detachtiện ích này:

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

Người ta có thể tạo ra một bí danh cho điều này. Tôi thích detachhơn nohupkhi đóng stdin stdout và stderr theo mặc định để lời gọi của nó sạch hơn.


3
Than ôi, detachdường như không tồn tại trong distro của tôi. nohupkhởi chạy tiến trình, nhưng vẫn chiếm cửa sổ terminal.
Nick Tomlin

detachcũng không phải trong distro của tôi; nhưng python có thể xử lý việc mở URL và tách ra : python -m webbrowser -t "http://example.com". Điều này sẽ hoạt động vượt trội trên hầu hết các bản phát hành gần đây của linux.
Krets

Mặc dù detachthậm chí không có trong AUR, nó đã chứng minh dễ dàng cài đặt từ nguồn và hơn nữa là chương trình duy nhất đạt được những gì tôi muốn. (các lựa chọn thay thế được liệt kê ở đây và trên detachtrang web không cho phép đóng vỏ miễn xdg-openlà đang chạy hoặc ít nhất detachkhông làm cho vỏ của tôi phàn nàn một chút)
rien333

4

xdg-openchờ chương trình kết thúc Đây là do thiết kế. Nếu chương trình là một chương trình chế độ văn bản, nó phải ở trong nền trước trong thiết bị đầu cuối. Ngay cả khi chương trình là GUI, hành vi này vẫn hữu ích trong trường hợp xdg-openđược sử dụng từ tập lệnh và tập lệnh muốn thực hiện một cái gì đó sau khi tập tin đã được chỉnh sửa (ví dụ: gửi phiên bản mới ở đâu đó hoặc tạo một cái gì đó với phiên bản mới).

Nếu bạn không muốn chờ đợi, hãy chạy xdg-opentrong nền. Bạn có thể chạy bất kỳ lệnh shell nào trong nền bằng cách đặt dấu và ở cuối.

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

Với một số chương trình, xdg-opentrả lại ngay lập tức. Điều gì xảy ra thực sự là chương trình xdg-opengọi trở lại ngay lập tức. Điều này thường xảy ra với các chương trình GUI mở tất cả các tệp trong một trường hợp duy nhất: khi bạn khởi động chúng lần thứ hai, chúng sẽ gửi một thông báo về thể hiện đang chạy để bảo nó mở tệp và thoát ngay lập tức.


Làm thế nào để các ứng dụng như vậy thực hiện chính sách cá thể? DBus là một cách tôi biết nhưng có cách nào để thực hiện điều này không?
PnotNP

@NulledPulum Khóa tập tin, tin nhắn cửa sổ X11, D-Bus, Tôi cho rằng D-Bus là cách tiêu chuẩn của Fre Frekopop nhưng tôi không biết có một đặc điểm kỹ thuật chính thức nào cho việc này không.
Gilles 'SO- đừng trở nên xấu xa'

2
Trên hệ thống Ubuntu 16.04 của tôi, xdg-open luôn trả về ngay lập tức. Đối với ứng dụng hiện tại của tôi, tôi thực sự muốn nó chặn. Trường hợp "xdg-open của bạn chờ chương trình kết thúc. Đây là do thiết kế." thông tin đến từ đâu?
Charl Botha

@CharlBotha xdg-opentrả về ngay lập tức (tôi có thể xác nhận rằng trên Ubuntu 16.04), nhưng chương trình mà nó gọi có thể chuyển sang nền. Ví dụ, trên hệ thống của tôi, xdg-opengọi Evince cho các tệp PDF; evince foo.pdfchặn cho đến khi bạn đóng tệp PDF, trừ khi PDF đã mở, trong trường hợp đó, evincequy trình thứ hai bắt đầu bằng cách xdg-opentập trung vào thể hiện hiện có và thoát. xdg-openkhông kiểm soát được điều đó, trừ khi có cách để làm cho chương trình tiếp tục chạy.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi nghĩ bạn đã hiểu lầm Charl Botha. Câu trả lời của bạn nêu rõ "xdg-open chờ chương trình kết thúc. Đây là do thiết kế.". Nhưng sau đó, bình luận của bạn cho biết "xdg-open return ngay lập tức" ... trái ngược nhau.
cheshirekow

1

Bằng cách kết hợp câu trả lời của terdonthảo luận của Dan D. vềnohup tôi đã tạo ra một chức năng thực hiện chính xác những gì tôi muốn:

  1. Mở tệp trong ứng dụng đã chọn mà không có bất kỳ ghi vào thiết bị đầu cuối nào.
  2. Gỡ bỏ quá trình để cửa sổ đầu cuối có thể được đóng lại.
  3. Không ghi bất kỳ lỗi nào mà ứng dụng tạo ra cho thiết bị đầu cuối.

Tôi đã thêm nó vào .bashrc/.zshrctập tin của mình :

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

Đối với một lời giải thích /dev/null 2>&1xem cuộc thảo luận này về ẩn stdoutstderr .


0

Thử đi:

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

Tôi sử dụng kỹ thuật này để en-queue nam châm: // URL vào máy khách Bit Torrent của tôi.

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

Các trích dẫn duy nhất giúp bảo vệ nội dung của các URL để trình bao không cố gắng diễn giải chúng.


Điều này vẫn giữ cho quá trình chạy trong cửa sổ thiết bị đầu cuối hiện tại. Hãy cho tôi biết nếu tôi cần làm rõ câu hỏi của tôi.
Nick Tomlin

Vâng, nếu bạn muốn nó đi vào nền ngay lập tức thì chỉ cần đặt nó xuống nền với dấu "&". Không phải đó là câu trả lời của @ terdon phải làm sao?
slm

Vấn đề ở đây không phải là xdg-open, hãy xem câu trả lời @Gilles, anh ấy giải thích lý do tại sao xdg-open đang bị giữ, đó là GUI bạn đang gửi URL đang khiến xdg-open chờ đợi.
slm

Trình duyệt nào bạn đang gửi URL tới? Có một hộp thoại hoặc bất cứ điều gì khác được bật lên khi bạn gửi URL w / xdg-open? Có vẻ như một số người trả lời ở đây đã chỉ ra rằng hành vi bình thường là điều khiển được đưa trở lại thiết bị đầu cuối sau một khoảng thời gian.
slm

Cảm ơn bạn đã làm rõ. Tôi đã xem lại các câu trả lời và tôi hiểu điều này tốt hơn bây giờ. Trình duyệt là iceweasal.
Nick Tomlin

0

Nếu bạn cần mở các trang web từ dòng lệnh (vòng lặp), bạn chỉ cần mở trình duyệt trước khi bắt đầu tập lệnh.

Trong trường hợp này, nó không đợi trình duyệt bị đóng sau liên kết đầu tiên, nhưng mở tất cả chúng trong các tab mới.


0

Như ngày nay, không có lựa chọn nào trong số đó làm việc cho tôi. Tôi hoàn toàn biết rằng OP đã nói "sử dụng xdg-open", xin lỗi trước.

Tôi đã kết thúc việc làm đơn giản chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es .

Nếu bạn không có bất kỳ trình duyệt nào trong số 3 trình duyệt đó, thì bạn chỉ cần sử dụng đúng trình duyệt với sở thích đặt hàng của mình.

Lưu ý: Firefox đã mở một cửa sổ mới mà không cần thêm bất cứ thứ gì. Trường hợp không làm việc rõ ràng cho bạn, sử dụng firefox https://google.es -new-instance -new-window. Lưu ý rằng chỉ là một -cho cờ firefox.


0

từ chối là lệnh đúng cho việc này.

Tôi sử dụng 2 chức năng cho việc này, để giữ cho nó dễ đọc hơn.

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

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

Điều gì, bạn tin rằng một chức năng gọi một chức năng khác dễ đọc và dễ hiểu hơn một chức năng dài ba dòng?
G-Man nói 'Phục hồi Monica'

disownkhông ngăn chặn lỗi được gửi đến thiết bị đầu cuối.
LondonRob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.