Команда `open`, чтобы открыть файл в приложении

13

Почему я не могу запустить эту команду в моем терминале:

open index.html

Разве не предполагалось открыть этот файл в моем браузере? Кроме того, я не могу запустить эту команду: open index.html -a "Sublime Text". Результатом этих команд являются:

$ 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
Я предполагаю, что вы имеете в виду, xdg-openкоторый должен открыть файл в вашем браузере. Команда openявляется ссылкой на openvtкоманду и открывает двоичный файл в новой виртуальной консоли. Это явно не то, что вы хотите.
Марко
1
Предполагая, что вы находитесь в системе OSX? Я не верю, что в openLinux есть какая-либо команда.
SLM
1
@slm, как указывает Марко, в openLinux есть команда, связанная с openvt; сообщения об ошибках в вопросе соответствуют этой ситуации.
Стивен Китт
xdg-open filename_or_URL
Иджаз Ахмад Хан
1
@EdgarOliveira Если вы хотите открыть программу (двоичную), просто введите ее имя в терминал. Если вы хотите открыть файл со связанной программой, используйте, xdg-open <file>и он должен открыть файл с соответствующей программой.
Марко

Ответы:

18

Основная цель команды OS X open- открыть файл в связанном приложении. Эквивалент этого на современных не OSX-юнитах есть xdg-open.

xdg-open index.html

xdg-openне имеет эквивалента OSX open -aдля открытия файла в определенном приложении. Это связано с тем, что обычный способ открыть файл в приложении - просто ввести имя приложения и имя файла. Точнее, вам нужно ввести имя исполняемой программы, которая реализует приложение.

sublime_text index.html

Linux, как и другие системы Unix (но не, насколько мне известно, не-Unixy части OS X) управляет программным обеспечением, отслеживая его с помощью менеджера пакетов, и помещает отдельные файлы туда, где они используются . Например, все исполняемые программы находятся в небольшом наборе каталогов, и все эти каталоги перечислены в PATHпеременной ; Выполняется sublime_textпоиск файла sublime_textв каталогах, перечисленных в PATH. OS X нуждается в дополнительном уровне косвенности open -aдля обработки приложений, которые распакованы в одном дереве каталогов и зарегистрированы в базе данных приложений. В Linux нет базы данных приложений, но она организована таким образом, что ей не нужна.

Если запуск командной sublime_textоболочки не работает для вас, то Sublime Text не был установлен должным образом. Я никогда не использовал его, и, по-видимому, он поставляется как архив tar, а не как дистрибутив (например, deb или rpm), поэтому, возможно, вам потребуется выполнить дополнительный шаг установки. Это действительно работа создателей Sublime Text, чтобы сделать это автоматически, но если они этого не сделали, вы, вероятно, можете сделать это самостоятельно, выполнив команду

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

Замените на путь, где sublime_textисполняемый файл, конечно.

Команда, с которой openвы столкнулись, является более старым именем openvtкоманды (некоторые дистрибутивы Linux включают его только под именем openvt). Команда openvtсоздает новую виртуальную консоль , которая может быть выполнена только пользователем root и редко используется в этом столетии, поскольку большинство людей когда-либо работают только в графической оконной среде.

Жиль "ТАК - перестань быть злым"
источник
но если я запустил эту команду "sublime_text indext.html", я получу этот результат "sublime_text: команда не найдена" Как я могу решить эту проблему?
Эдгар Оливейра
@ EdgarOliveira Я думаю, я вижу проблему, очевидно, Sublime Text не поставляется с надлежащим пакетом? Смотрите мое редактирование.
Жиль "ТАК - перестань быть злым"
Я создал псевдоним для этого: псевдоним sublimetext = '/ opt / sublime_text / sublime_text / home / user / Documents / sandbox / webdeveloper', но когда я выполняю "sublimetext", открывается два окна, вместо этого только одно! Почему? Спасибо
Эдгар Оливейра
Когда я изменил файл .bashrc, у меня возникло сомнение: «Как сбросить файл .bashrc для выполнения нового псевдонима на том же терминале, где я внес изменения?» Гугл это и нашел ответ, в Unix & Linux, и только у вас есть выполнить команду "bash", и вы запустите ваш новый псевдоним :)
Эдгар Оливейра
7

Вы не упоминаете операционную систему, которую используете.

В некоторых дистрибутивах Linux openкоманда является символической ссылкой на openvtкоманду, которая открывает двоичный файл в новой виртуальной консоли. Это явно не то, что вы хотите. Ваши сообщения об ошибках действительно указывают, что вы вызвали openvtкоманду. Эта команда ожидает двоичный файл программы (исполняемый файл) в качестве аргумента.

Я предполагаю, что вы имеете в виду, xdg-openчто, в отличие от openvt, не ожидает исполняемый файл в качестве аргумента, а файл, который связан с программой и открывает файл с программой. Вы можете передавать файлы и URL-адреса в качестве аргументов.

Поэтому xdg-open index.htmlследует открыть файл в браузере, xdg-open image.pngоткрыть файл в программе просмотра изображений и т. Д.

Marco
источник
1
Единственная проблема - xdg-open откроет файл в приложении по умолчанию для этого типа файла. Вы не можете выбрать приложение с помощью xdg-open. Я не знаю, есть ли команда для выбора приложения, но если вы знаете приложение (как в примере «Sublime Text»), будет лучше вызвать программу напрямую.
X3MBoy
1
@ X3MBoy Идея xdg-openвызова состоит в том, чтобы вызвать приложение по умолчанию для этого файла. Если вы хотите использовать другую программу, просто позвоните <program> <file>. Я не вижу проблемы.
Марко
Он попросит какой - то команды , чтобы сделать: open index.html -a "Sublime Text" -Вот почему я говорю «проблемы», потому что если вы используете , xdg-openчтобы открыть файл HTML, есть bettern вероятность того, что й файл будет открыт в браузере не в текстовом редакторе , как «Sublime Text»
X3MBoy
3

Хотя люди часто называют xdg-openэмулирующую функциональность open, macOS openнемного отличается, потому что он 1. не перенаправляет ничего из stdout / stedrr и 2. отсоединяет все, что вы хотите запустить от терминала (что почти всегда то, что вы хотите при запуске GUI приложения, чтобы у вас не было терминалов, лежащих вокруг)

Чтобы решить эту проблему, я придумал правильный эквивалент, используя некоторые стандартные инструменты GNU (синтаксис - «рыбная оболочка», но преобразование в bash тривиально):

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

Добавлено :

Для тех, кто использует оболочку bash, вот функция:

open ()
{
    for i in $*
    do
        setsid nohup xdg-open $i > /dev/null 2> /dev/null
    done
}
rien333
источник
2

Мое решение (используется ежедневно) заключается в использовании aliasдля xdg-open.

Просто поместите это на свой ~/.bashrc:

alias open='xdg-open '

Затем закройте и перезапустите вашу оболочку или source ~/.bashrc.

Теперь вы можете открыть любой файл с помощью этой команды ... из .png в .jpg в .docx в .pdf в .txt.

SLM
источник