Lệnh `open` để mở một tệp trong một ứng dụng


13

Tại sao tôi không thể chạy lệnh này trong thiết bị đầu cuối của mình:

open index.html

Không phải nó đã mở tập tin này trên trình duyệt của tôi sao? Tôi cũng không thể chạy lệnh này : open index.html -a "Sublime Text". Kết quả của các lệnh này là:

$ 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

2
Tôi giả sử bạn có nghĩa là xdg-opennên mở tệp trong trình duyệt của bạn. Các openlệnh là một liên kết đến các openvtlệnh và mở ra một nhị phân trong một giao diện điều khiển ảo mới. Đó rõ ràng không phải là điều bạn muốn.
Marco

1
Giả sử bạn đang sử dụng hệ thống OSX? Tôi không tin có bất kỳ openlệnh nào trên Linux.
slm

1
@slm, như Marco chỉ ra, có một openlệnh trên Linux, được liên kết đến openvt; các thông báo lỗi trong câu hỏi phù hợp với tình huống đó.
Stephen Kitt

xdg-mở tên
tệp_or_URL

1
@EdgarOliveira Nếu bạn muốn mở một chương trình (nhị phân), chỉ cần nhập tên của nó vào thiết bị đầu cuối. Nếu bạn muốn mở một tệp có chương trình liên quan, hãy sử dụng xdg-open <file>và nó sẽ mở tệp có chương trình tương ứng.
Marco

Câu trả lời:


18

Mục đích chính của openlệnh OS X là mở một tệp trong ứng dụng được liên kết. Tương đương với điều đó trên các đơn vị không phải OSX hiện đại là xdg-open.

xdg-open index.html

xdg-openkhông có tương đương với OSX open -ađể mở tệp trong ứng dụng cụ thể. Đó là bởi vì cách thông thường để mở tệp trong ứng dụng là chỉ cần nhập tên của ứng dụng theo sau là tên của tệp. Chính xác hơn, bạn cần gõ tên của chương trình thực thi thực hiện ứng dụng.

sublime_text index.html

Linux, giống như các hệ thống Unix khác (nhưng không, theo như tôi biết, các phần không phải là Unix của OS X) quản lý phần mềm bằng cách theo dõi nó với trình quản lý gói và đặt các tệp riêng lẻ nơi chúng được sử dụng . Ví dụ, tất cả các chương trình thực thi nằm trong một tập hợp nhỏ các thư mục và tất cả các thư mục đó được liệt kê trong PATHbiến ; đang chạy sublime_texttìm kiếm một tập tin được gọi sublime_texttrong các thư mục được liệt kê trong PATH. OS X cần thêm một mức độ gián tiếp, thông qua open -a, để xử lý các ứng dụng được giải nén trong một cây thư mục duy nhất và được đăng ký trong cơ sở dữ liệu ứng dụng. Linux không có bất kỳ cơ sở dữ liệu ứng dụng nào, nhưng nó được tổ chức theo cách mà nó không cần.

Nếu chạy sublime_textshell lệnh không phù hợp với bạn, thì Sublime Text chưa được cài đặt đúng cách. Tôi chưa bao giờ sử dụng nó và dường như nó là một kho lưu trữ tar, không phải là gói phân phối (ví dụ: deb hoặc vòng / phút), vì vậy có thể bạn cần thực hiện thêm một bước cài đặt. Đó thực sự là công việc của những người tạo ra Sublime Text để tự động thực hiện điều này, nhưng nếu họ không làm điều đó, có lẽ bạn có thể tự làm điều đó bằng cách chạy lệnh

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

Thay thế bằng con đường nơi sublime_textthực thi là, tất nhiên.

Các openlệnh mà bạn gặp phải là một tên tuổi cho openvtlệnh (một số bản phân phối Linux chỉ bao gồm nó dưới cái tên openvt). Các openvtlệnh tạo ra một mới bàn giao tiếp ảo , mà chỉ có thể được thực hiện bằng gốc và không được sử dụng rất thường xuyên trong thế kỷ này vì hầu hết người duy nhất từng làm việc trong một môi trường cửa sổ đồ họa.


nhưng nếu tôi chạy lệnh này "sublime lòng indext.html" Tôi nhận được kết quả này "sublime lòng: lệnh không tìm thấy" Làm thế nào tôi có thể dẫn đến vấn đề đó?
Edgar Oliveira

@EdgarOliveira Tôi nghĩ rằng tôi thấy vấn đề, rõ ràng Sublime Text không đi kèm với một gói thích hợp? Xem chỉnh sửa của tôi.
Gilles 'SO- ngừng trở thành ác quỷ'

Tôi đã tạo một bí danh cho điều đó: bí danh Tại sao? Cảm ơn
Edgar Oliveira

Khi tôi thay đổi tệp .bashrc, tôi có nghi ngờ "Làm cách nào để đặt lại tệp .bashrc để có thể thực thi một bí danh mới, trên cùng một thiết bị đầu cuối nơi tôi đã thực hiện các thay đổi?" Google và tìm thấy câu trả lời, trong Unix & Linux, và chỉ có bạn mới thực hiện lệnh "bash" và bạn sẽ chạy bí danh mới của mình :)
Edgar Oliveira

7

Bạn không đề cập đến hệ điều hành bạn đang sử dụng.

Trên một số bản phân phối Linux, openlệnh là một liên kết tượng trưng đến openvtlệnh mở tệp nhị phân trong bảng điều khiển ảo mới. Đó rõ ràng không phải là điều bạn muốn. Thông báo lỗi của bạn thực sự chỉ ra rằng bạn đã gọi openvtlệnh. Lệnh này dự kiến ​​một nhị phân chương trình (một tệp thực thi) làm đối số.

Tôi giả sử bạn có nghĩa là xdg-open, ngược lại openvt, không mong đợi một thực thi là đối số, nhưng một tệp được liên kết với một chương trình và mở tệp với chương trình. Bạn có thể truyền tệp và URL làm đối số.

Do đó, xdg-open index.htmlnên mở tệp trong trình duyệt của bạn, xdg-open image.pngnên mở tệp trong trình xem hình ảnh của bạn, v.v.


1
Vấn đề duy nhất là xdg-open sẽ mở tệp trong ứng dụng mặc định cho kiểu tệp. Bạn không thể chọn ứng dụng với xdg-open. Tôi không biết nếu có lệnh chọn ứng dụng, nhưng nếu bạn biết ứng dụng (như trong ví dụ "Sublime Text"), sẽ tốt hơn nếu gọi trực tiếp chương trình.
X3MBoy

1
@ X3MBoy Ý tưởng đằng sau xdg-opencuộc gọi là gọi ứng dụng mặc định cho tệp đó. Nếu bạn muốn sử dụng một chương trình khác, chỉ cần gọi <program> <file>. Tôi thất bại trong cách nhìn nhận vấn đề.
Marco

Anh ta yêu cầu một số lệnh phải làm: open index.html -a "Sublime Text" -Đó là lý do tại sao tôi nói "vấn đề", bởi vì nếu bạn sử dụng xdg-openđể mở tệp html, có nhiều khả năng tệp đó sẽ được mở bởi trình duyệt không phải bởi trình soạn thảo văn bản như "Sublime Text"
X3MBoy

3

Mặc dù mọi người thường đặt tên xdg-openlà mô phỏng chức năng của open, macOS openhơi khác một chút vì nó 1. không chuyển hướng bất cứ thứ gì từ stdout / stedrr và 2. loại bỏ bất cứ thứ gì bạn muốn chạy từ thiết bị đầu cuối (gần như luôn luôn là những gì bạn muốn khi khởi chạy GUI các ứng dụng để bạn không có thiết bị đầu cuối đặt xung quanh)

Để giải quyết vấn đề này, tôi đã đưa ra một cách tương đương thích hợp bằng cách sử dụng một số công cụ GNU tiêu chuẩn (cú pháp là vỏ cá, nhưng việc chuyển đổi thành bash là không đáng kể):

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

Đã thêm :

Đối với những người sử dụng bash shell, đây là chức năng:

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

2

Giải pháp của tôi (được sử dụng hàng ngày) là sử dụng aliascho xdg-open.

Chỉ cần đặt cái này lên ~/.bashrc:

alias open='xdg-open '

Sau đó đóng và khởi động lại vỏ của bạn hoặc source ~/.bashrc.

Bây giờ bạn có thể mở bất kỳ tệp nào bằng lệnh đó ... từ .png đến .jpg đến .docx đến .pdf sang .txt.

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.