perintah `open` untuk membuka file dalam aplikasi

13

Mengapa saya tidak bisa menjalankan perintah ini di terminal saya:

open index.html

Bukankah seharusnya membuka file ini di browser saya? Juga saya tidak bisa menjalankan perintah ini: open index.html -a "Sublime Text". Hasil dari perintah ini adalah:

$ open index.html
Couldn't get a file descriptor referring to the console

$ open index.html -a "Sublime Text" - 
open: invalid option -- 'a' 
Usage: open [OPTIONS] -- command
Edgar Oliveira
sumber
2
Saya berasumsi maksud Anda xdg-openyang harus membuka file di browser Anda. The openperintah link ke openvtkomando dan membuka biner dalam konsol virtual baru. Tampaknya bukan itu yang Anda inginkan.
Marco
1
Dengan asumsi Anda menggunakan sistem OSX? Saya tidak percaya ada openperintah di Linux.
slm
1
@slm, seperti yang ditunjukkan Marco, ada openperintah di Linux, yang ditautkan ke openvt; pesan kesalahan dalam pertanyaan konsisten dengan situasi itu.
Stephen Kitt
xdg-open filename_or_URL
Ijaz Ahmad Khan
1
@ EdgarOliveira Jika Anda ingin membuka program (biner) cukup ketik namanya ke terminal. Jika Anda ingin membuka file dengan program terkait, gunakan xdg-open <file>dan itu harus membuka file dengan program yang sesuai.
Marco

Jawaban:

18

Tujuan utama openperintah OS X adalah untuk membuka file di aplikasi terkait. Setara dengan itu pada unix non-OSX modern adalah xdg-open.

xdg-open index.html

xdg-opentidak memiliki yang setara dengan OSX open -auntuk membuka file di aplikasi tertentu. Itu karena cara normal untuk membuka file dalam aplikasi adalah dengan mengetikkan nama aplikasi diikuti dengan nama file. Lebih tepatnya, Anda perlu mengetikkan nama program yang dapat dieksekusi yang mengimplementasikan aplikasi.

sublime_text index.html

Linux, seperti sistem Unix lainnya (tetapi tidak, sejauh yang saya tahu, bagian non-Unixy dari OS X) mengelola perangkat lunak dengan melacaknya dengan manajer paket, dan menempatkan file individual di mana mereka digunakan . Sebagai contoh, semua program yang dapat dieksekusi dalam satu set direktori kecil dan semua direktori tersebut terdaftar dalam PATHvariabel ; menjalankan sublime_textmencari file yang disebut sublime_textdi direktori yang terdaftar di PATH. OS X memerlukan tingkat tipuan ekstra, melalui open -a, untuk menangani aplikasi yang dibongkar dalam pohon direktori tunggal dan terdaftar dalam database aplikasi. Linux tidak memiliki basis data aplikasi apa pun, tetapi diorganisasikan sedemikian rupa sehingga tidak memerlukannya.

Jika menjalankan sublime_textshell perintah tidak berfungsi untuk Anda, maka Sublime Text belum diinstal dengan benar. Saya tidak pernah menggunakannya, dan tampaknya itu datang sebagai arsip tar, bukan sebagai paket distribusi (mis. Deb atau rpm), jadi mungkin Anda perlu melakukan langkah instalasi tambahan. Ini benar-benar pekerjaan pembuat Sublime Text untuk membuat ini otomatis, tetapi jika mereka belum melakukannya, Anda mungkin dapat melakukannya sendiri dengan menjalankan perintah

sudo -s …/sublime_text /usr/local/bin

Ganti dengan jalur di mana sublime_textexecutable berada, tentu saja.

The openperintah Anda temui adalah nama yang lebih tua untuk openvtperintah (beberapa distribusi Linux hanya memasukkannya dengan nama openvt). The openvtPerintah menciptakan baru konsol virtual , yang hanya dapat dilakukan oleh root dan tidak digunakan sangat sering di abad ini karena kebanyakan orang hanya pernah bekerja di lingkungan jendela grafis.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
tetapi jika saya menjalankan perintah ini "sublime_text indext.html" Saya menerima hasil ini "sublime_text: perintah tidak ditemukan" Bagaimana saya dapat menghasilkan masalah itu?
Edgar Oliveira
@ EdgarOliveira Saya pikir saya melihat masalahnya, ternyata Sublime Text tidak datang dengan paket yang tepat? Lihat hasil edit saya.
Gilles 'SO- stop being evil'
Saya membuat alias untuk itu: alias sublimetext = '/ opt / sublime_text / sublime_text / home / user / Documents / sandbox / webdeveloper' tetapi ketika saya menjalankan "sublimetext" membuka dua jendela, alih-alih hanya satu! Mengapa? Terima kasih
Edgar Oliveira
Ketika saya mengubah file .bashrc saya ragu "Bagaimana mengatur ulang file .bashrc untuk dapat menjalankan alias baru, pada terminal yang sama di mana saya melakukan perubahan?" Google dan temukan jawabannya, di Unix & Linux, dan hanya Anda yang menjalankan perintah "bash" dan Anda akan menjalankan alias baru milik Anda :)
Edgar Oliveira
7

Anda tidak menyebutkan sistem operasi yang Anda gunakan.

Pada beberapa distribusi Linux, openperintahnya adalah tautan simbolik ke openvtperintah yang membuka biner di konsol virtual baru. Tampaknya bukan itu yang Anda inginkan. Pesan kesalahan Anda memang menunjukkan bahwa Anda menjalankan openvtperintah. Perintah ini mengharapkan biner program (yang dapat dieksekusi) sebagai argumen.

Saya berasumsi maksud Anda xdg-openyang, berbeda dengan openvt, tidak mengharapkan eksekusi sebagai argumen, tetapi file yang terkait dengan suatu program dan membuka file dengan program tersebut. Anda dapat mengirimkan file dan URL sebagai argumen.

Karena itu xdg-open index.htmlharus membuka file di browser Anda, xdg-open image.pngharus membuka file di penampil gambar Anda, dll.

Marco
sumber
1
Satu-satunya masalah adalah xdg-open akan membuka file dalam aplikasi default untuk tipe file. Anda tidak dapat memilih aplikasi dengan xdg-open. Saya tidak tahu apakah ada perintah untuk memilih aplikasi, tetapi jika Anda tahu aplikasi (seperti pada contoh "Teks Sublime") akan lebih baik untuk memanggil program secara langsung.
X3MBoy
1
@ X3MBoy Gagasan di balik xdg-openpanggilan ini adalah untuk memanggil aplikasi default untuk file itu. Jika Anda ingin menggunakan program lain, panggil saja <program> <file>. Saya gagal melihat masalahnya.
Marco
Dia meminta beberapa perintah untuk dilakukan: open index.html -a "Sublime Text" -Itu sebabnya saya katakan "masalah", karena jika Anda menggunakan xdg-openuntuk membuka file html, ada kemungkinan bahwa file th akan dibuka oleh browser bukan oleh editor teks seperti "Sublime Text"
X3MBoy
3

Walaupun orang sering menyebut xdg-opensebagai meniru fungsi dari open, macOS openagak berbeda karena 1. tidak mengalihkan apa pun dari stdout / stedrr dan 2. melepaskan apa pun yang ingin Anda jalankan dari terminal (yang hampir selalu seperti yang Anda inginkan ketika meluncurkan GUI aplikasi sehingga Anda tidak memiliki terminal yang tergeletak)

Untuk mengatasinya, saya telah membuat padanan yang sepadan dengan menggunakan beberapa alat GNU standar (sintaksnya adalah shell ikan, tetapi konversi ke bash adalah sepele):

function open
    for i in $argv
        setsid nohup xdg-open $i > /dev/null 2> /dev/null
    end
end

Ditambahkan :

Bagi mereka yang menggunakan bash shell, berikut adalah fungsinya:

open ()
{
    for i in $*
    do
        setsid nohup xdg-open $i > /dev/null 2> /dev/null
    done
}
rien333
sumber
2

Solusi saya (digunakan setiap hari) adalah menggunakan aliasfor xdg-open.

Letakkan ini di ~/.bashrc:

alias open='xdg-open '

Kemudian tutup dan mulai kembali shell Anda atau source ~/.bashrc.

Sekarang Anda dapat membuka file apa pun dengan perintah itu ... dari .png ke .jpg ke .docx ke .pdf ke .txt.

slm
sumber