ใช้ xdg-open เพื่อเปิด URL ด้วยกระบวนการใหม่


13

ฉันเริ่มที่จะทดลองกับCrunchbang (ซึ่งจะขึ้นอยู่กับ Debian และใช้เทอร์มิ ) xdg-openเป็นสภาพแวดล้อมการพัฒนาเว็บและหนึ่งในสิ่งที่ฉันกำลังดิ้นรนกับพฤติกรรมของ ฉันมาจากพื้นหลัง OSX ดังนั้นโปรดยกโทษให้ฉันถ้าคำถามนี้ออกมาหนาแน่น

ฉันต้องการเปิด url ด้วยxdg-open http://www.google.comและจากนั้นใช้หน้าต่างเทอร์มินัลเดียวกันต่อไปในการทำงาน (เป็นวิธีการopenทำงานใน OSX) ตอนนี้การใช้จะใช้xdg-openแท็บ / เซสชันปัจจุบันจนกว่าฉันจะปิดหน้าต่างเบราว์เซอร์หรือสิ้นสุดสิ่งต่างๆด้วยctrl + cตนเอง ฉันต้องการให้มันเริ่มกระบวนการใหม่ด้วยวิธีที่ฉันสามารถเปิด URL อ้างถึงข้อมูลในหน้านั้นและใช้ในแท็บ / หน้าต่างเดียวกันโดยไม่ต้องเปิดอีกหนึ่งวิธี


คุณใช้เว็บเบราว์เซอร์ใดอยู่
Cristian Ciupitu

คำตอบ:


11

แปลกมันใช้งานได้เช่นนั้นออกจากกล่องบนเดเบียนของฉัน ลองเรียกใช้เป็นพื้นหลัง:

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

คุณสามารถทำให้สิ่งนี้เป็นฟังก์ชั่นโดยการเพิ่มบรรทัดเหล่านี้ไปยัง~/.bashrcไฟล์ของคุณ:

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

จากนั้นคุณสามารถเรียกใช้open http://www.google.comและมันจะทำงานในพื้นหลัง


1
มันใช้งานได้ดี ฉันหวังว่าจะมีนามแฝงง่าย ๆopen(เช่น open = 'xdg-open') มีวิธีรับฟังก์ชั่นการทำงานxdg-open <url> &โดยไม่ต้องใช้ฟังก์ชันเชลล์หรือไม่?
Nick Tomlin

@ NickTomlin ไม่เท่าที่ฉันรู้ไม่ แต่คุณมีอะไรกับฟังก์ชั่น? อย่างที่คุณเห็นในคำตอบที่อัปเดตของฉันมันเป็นเรื่องง่ายเหมือน alias
terdon

ไม่ใช่ความลำเอียงโดยเฉพาะฉันหวังว่าจะหลีกเลี่ยงฟังก์ชั่นตั้งแต่ฉันพยายามใช้ (และใช้ซ้ำ) นามแฝงเดียวกันสำหรับทั้ง Mac OS และ * nix รสชาติ
Nick Tomlin

ไม่มีเหตุผลว่าทำไมคุณถึงทำไม่ได้ ฟังก์ชั่นขึ้นอยู่กับเชลล์ตราบใดที่คุณใช้ bash ในทุกระบบที่มีปัญหามันควรจะทำงานได้อย่างสมบูรณ์แบบ
terdon

มันทำงานนอกกรอบใน Fedora 20 ด้วย
Cristian Ciupitu

7

หากคุณต้องการแยกกระบวนการออกจากเชลล์ปัจจุบันแทนที่จะเริ่มเป็นงานแบ็คกราวน์ด้วยxdg-open http://www.google.com &ฉันชอบdetachยูทิลิตี้:

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

หนึ่งสามารถสร้างนามแฝงสำหรับสิ่งนี้ ผมชอบdetachมากกว่าnohupเป็นปิด stdin stdout และ stderr โดยค่าเริ่มต้นเพื่อการภาวนาของมันคือการทำความสะอาด


3
อนิจจาdetachดูเหมือนจะไม่อยู่ในความโกลาหลของฉัน nohupเปิดใช้งานกระบวนการ แต่ยังคงใช้งานหน้าต่างเทอร์มินัล
Nick Tomlin

detachไม่ได้อยู่ใน distro ของฉันด้วย; แต่หลามสามารถจัดการกับการเปิด URL python -m webbrowser -t "http://example.com"และที่พลัดพราก: สิ่งนี้ควรทำงานนอกกรอบของ linux เกือบทั้งหมดที่เพิ่งเกิดขึ้น
Krets

แม้ว่าdetachจะไม่ได้อยู่ใน AUR แต่ก็พิสูจน์แล้วว่าง่ายต่อการติดตั้งจากแหล่งและยิ่งเป็นโปรแกรมเดียวที่บรรลุสิ่งที่ฉันต้องการ (ตัวเลือกที่แสดงไว้ที่นี่และบนdetachเว็บไซต์ไม่อนุญาตให้ปิดเชลล์ตราบใดที่xdg-openทำงานหรืออย่างน้อยdetachก็ไม่ทำให้เชลล์ของฉันบ่นหนึ่งบิต)
rien333

4

xdg-openรอให้โปรแกรมเสร็จสิ้น นี่คือโดยการออกแบบ หากโปรแกรมเป็นโปรแกรมโหมดข้อความจะต้องอยู่ในเบื้องหน้าในเทอร์มินัล แม้ว่าโปรแกรมจะเป็น GUI หนึ่งพฤติกรรมนี้มีประโยชน์ในกรณีที่xdg-openใช้จากสคริปต์และสคริปต์ต้องการดำเนินการบางอย่างหลังจากไฟล์ได้รับการแก้ไข (เช่นส่งเวอร์ชันใหม่ที่อื่นหรือสร้างบางอย่างด้วยเวอร์ชันใหม่)

หากคุณไม่ต้องการรอให้ทำงานxdg-openในพื้นหลัง คุณสามารถเรียกใช้คำสั่งเชลล์ใด ๆ ในพื้นหลังโดยใส่เครื่องหมายและท้าย

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

สำหรับบางโปรแกรมให้xdg-openส่งคืนทันที สิ่งที่เกิดขึ้นเป็นจริงว่าโปรแกรมที่xdg-openเรียกคืนกลับมาทันที สิ่งนี้มักจะเกิดขึ้นกับโปรแกรม GUI ที่เปิดไฟล์ทั้งหมดในอินสแตนซ์เดียว: เมื่อคุณเริ่มครั้งที่สองพวกเขาจะส่งข้อความถึงอินสแตนซ์ที่กำลังทำงานเพื่อบอกให้เปิดไฟล์และออกจากทันที


แอปพลิเคชันดังกล่าวใช้นโยบายอินสแตนซ์เดียวได้อย่างไร DBus เป็นวิธีหนึ่งที่ฉันรู้ แต่มีวิธี 'xdg' ในการดำเนินการนี้
PnotNP

@ NulledPointer Lock ไฟล์ข้อความหน้าต่าง X11, D-Bus, ... ฉันคิดว่า D-Bus เป็นวิธีมาตรฐาน "Freedesktop" แต่ฉันไม่รู้ว่ามีข้อกำหนดอย่างเป็นทางการสำหรับสิ่งนี้หรือไม่
Gilles 'ดังนั้นหยุดความชั่วร้าย'

2
บนระบบ Ubuntu 16.04 ของฉัน xdg-open จะส่งคืนทันที สำหรับแอปพลิเคชันปัจจุบันของฉันฉันชอบที่มันบล็อกจริง ๆ "xdg-open ของคุณรอให้โปรแกรมเสร็จสิ้นนี่คือโดยการออกแบบ" ข้อมูลมาจากไหน?
Charl Botha

@CharlBotha xdg-openกลับมาทันที (ฉันสามารถยืนยันได้บน Ubuntu 16.04) แต่โปรแกรมที่เรียกใช้อาจย้ายไปที่พื้นหลัง ตัวอย่างเช่นในระบบของฉันxdg-openเรียกใช้ Evince สำหรับไฟล์ PDF evince foo.pdfบล็อกจนกว่าคุณจะปิดไฟล์ PDF ยกเว้นว่าไฟล์ PDF นั้นเปิดอยู่แล้วซึ่งในกรณีนี้evinceกระบวนการที่สองเริ่มต้นโดยxdg-openมุ่งเน้นไปที่อินสแตนซ์และออกที่มีอยู่ xdg-openไม่สามารถควบคุมสิ่งนั้นได้เว้นแต่จะมีวิธีที่จะทำให้โปรแกรมทำงานต่อไป
Gilles 'หยุดความชั่วร้าย' ใน

@Gilles ฉันคิดว่าคุณเข้าใจผิด Charl Botha คำตอบของคุณระบุว่า "xdg-open รอให้โปรแกรมเสร็จสิ้นนี่คือการออกแบบ" แต่ความคิดเห็นของคุณบอกว่า "xdg-open return ทันที" ... ซึ่งขัดแย้งกัน
cheshirekow

1

โดยการรวมคำตอบของ terdonและการสนทนาของ Dan D. ของnohupฉันฉันสร้างฟังก์ชันที่ทำสิ่งที่ฉันต้องการ:

  1. เปิดแฟ้มใน app ได้รับการแต่งตั้งโดยไม่ต้องใด ๆเขียนไปยังสถานีที่ทุกคน
  2. แยกกระบวนการเพื่อให้หน้าต่างเทอร์มินัลสามารถปิดได้
  3. ไม่ได้เขียนข้อผิดพลาดใด ๆ ที่แอปพลิเคชันสร้างขึ้นมาที่เครื่อง

ฉันเพิ่มสิ่งนี้ลงใน.bashrc/.zshrcไฟล์:

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

สำหรับ explanantion ของ/dev/null 2>&1ดูการอภิปรายเกี่ยวกับการหลบซ่อนตัวstdoutstderrและ


0

ลองสิ่งนี้:

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

ฉันใช้เทคนิคนี้ในการเข้าคิวแม่เหล็ก: // URL ลงใน Vuze ไคลเอนต์ Bit Torrent ของฉัน

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

เครื่องหมายคำพูดเดี่ยวช่วยปกป้องเนื้อหาของ URL เพื่อที่เชลล์จะไม่พยายามตีความมัน


สิ่งนี้ยังคงทำให้กระบวนการทำงานในหน้าต่างเทอร์มินัลปัจจุบัน แจ้งให้เราทราบหากต้องการชี้แจงคำถามของฉัน
Nick Tomlin

ใช่ถ้าคุณต้องการให้มันเป็นพื้นหลังทันทีเพียงแค่ใส่มันไว้ที่พื้นหลังด้วยเครื่องหมาย & "&" คำตอบของ @ terdon ไม่ได้บอกว่าจะทำอย่างไร
slm

ปัญหาที่นี่ไม่ได้เป็น xdg-open ดูที่ @Gilles คำตอบเขาอธิบายว่าทำไม xdg-open ถึงได้ถูกจัดการมันเป็น GUI ที่คุณส่ง URL ที่ทำให้ xdg-open รอ
slm

คุณส่ง URL ไปที่เบราว์เซอร์ใด มีกล่องโต้ตอบหรือสิ่งอื่นที่ถูกผุดขึ้นเมื่อคุณส่ง URL ที่ w / xdg-open? ดูเหมือนว่าผู้ตอบคำถามหลายคนที่นี่แสดงให้เห็นว่าพฤติกรรมปกติคือการควบคุมจะถูกส่งกลับไปยังสถานีหลังจากช่วงระยะเวลาหนึ่ง
slm

ขอขอบคุณสำหรับการชี้แจง. ฉันได้ตรวจสอบคำตอบแล้วและฉันเข้าใจสิ่งนี้ดีกว่าในตอนนี้ เบราว์เซอร์นั้นมีประโยชน์
Nick Tomlin

0

หากคุณต้องการเปิดหน้าเว็บจากบรรทัดคำสั่ง (ลูป) คุณสามารถเปิดเบราว์เซอร์ก่อนเริ่มสคริปต์

ในกรณีนี้จะไม่รอให้เบราว์เซอร์ปิดหลังจากลิงก์แรก แต่จะเปิดทั้งหมดในแท็บใหม่


0

ณ วันนี้ไม่มีตัวเลือกใดที่เหมาะกับฉัน ฉันรู้ว่า OP ใช้คำว่า "ใช้ xdg-open" ขออภัยล่วงหน้า

chrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.esฉันได้สิ้นสุดการทำตายง่าย

หากคุณไม่มีเบราว์เซอร์ใด ๆ จากทั้ง 3 เบราว์เซอร์คุณสามารถใช้เบราว์เซอร์ที่เหมาะสมกับการสั่งซื้อของคุณ

หมายเหตุ: Firefox เปิดหน้าต่างใหม่โดยไม่เพิ่มอะไรเลย กรณีที่ไม่ได้ทำงาน seamessly firefox https://google.es -new-instance -new-windowสำหรับคุณใช้ โปรดทราบว่าเป็นเพียงหนึ่ง-สำหรับธง Firefox


0

การปฏิเสธเป็นคำสั่งที่เหมาะสมสำหรับสิ่งนี้

ฉันใช้ 2 ฟังก์ชั่นสำหรับสิ่งนี้เพื่อให้อ่านง่ายขึ้น

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

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

สิ่งที่คุณเชื่อว่าฟังก์ชั่นที่เรียกฟังก์ชั่นอื่นนั้นง่ายต่อการอ่านและเข้าใจมากกว่าฟังก์ชั่นเดียวที่มีความยาวสามบรรทัด?
G-Man กล่าวว่า 'Reinstate Monica'

disownไม่ป้องกันข้อผิดพลาดที่ถูกส่งไปยังเครื่องเทอร์มินัล
LondonRob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.