Komenda `open`, aby otworzyć plik w aplikacji


13

Dlaczego nie mogę uruchomić tego polecenia w moim terminalu:

open index.html

Czy nie powinien otworzyć tego pliku w mojej przeglądarce? Również nie mogę uruchomić tego polecenia: open index.html -a "Sublime Text". Wynikiem tych poleceń są:

$ 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
Zakładam, że masz na myśli, xdg-openco powinno otworzyć plik w przeglądarce. openKomenda jest link do openvtkomendy i otwiera binarnego w nowej konsoli wirtualnej. Najwyraźniej nie tego chcesz.
Marco

1
Zakładając, że korzystasz z systemu OSX? Nie wierzę, żeby openw Linuksie było jakieś polecenie.
slm

1
@slm, jak wskazuje Marco, openw Linuksie istnieje polecenie powiązane z openvt; komunikaty o błędach w pytaniu są zgodne z tą sytuacją.
Stephen Kitt

xdg-open nazwa_pliku_lub_URL
Ijaz Ahmad Khan

1
@EdgarOliveira Jeśli chcesz otworzyć program (plik binarny), po prostu wpisz jego nazwę w terminalu. Jeśli chcesz otworzyć plik z powiązanym programem, użyj xdg-open <file>i powinien otworzyć plik z odpowiednim programem.
Marco

Odpowiedzi:


19

Podstawowym celem openpolecenia OS X jest otwarcie pliku w powiązanej aplikacji. Odpowiednikiem tego w nowoczesnych jednorożcach innych niż OSX jest xdg-open.

xdg-open index.html

xdg-opennie ma odpowiednika OSX open -ado otwarcia pliku w określonej aplikacji. Wynika to z faktu, że normalnym sposobem otwarcia pliku w aplikacji jest po prostu wpisanie nazwy aplikacji, a następnie nazwy pliku. Mówiąc dokładniej, musisz wpisać nazwę programu wykonywalnego, który implementuje aplikację.

sublime_text index.html

Linux, podobnie jak inne systemy uniksowe (ale o ile mi wiadomo, części OS X inne niż Unixy) zarządza oprogramowaniem poprzez śledzenie go za pomocą menedżera pakietów i umieszcza poszczególne pliki tam, gdzie są używane . Na przykład wszystkie programy wykonywalne znajdują się w małym zestawie katalogów, a wszystkie te katalogi są wymienione w PATHzmiennej ; uruchomione sublime_textwyszukuje plik o nazwie sublime_textw katalogach wymienionych w PATH. OS X potrzebuje dodatkowego poziomu pośredniczenia, open -aaby obsłużyć aplikacje rozpakowane w jednym drzewie katalogów i zarejestrowane w bazie danych aplikacji. Linux nie ma żadnej bazy danych aplikacji, ale jest zorganizowany w taki sposób, że nie potrzebuje żadnej.

Jeśli uruchomienie sublime_textpowłoki poleceń nie działa, oznacza to, że Sublime Text nie został poprawnie zainstalowany. Nigdy go nie używałem i najwyraźniej jest to archiwum tar, a nie pakiet dystrybucyjny (np. Deb lub rpm), więc możliwe jest, że musisz wykonać dodatkowy krok instalacji. Twórcy Sublime Text naprawdę wykonują to automatycznie, ale jeśli jeszcze tego nie zrobili, prawdopodobnie możesz to zrobić samodzielnie, uruchamiając polecenie

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

Oczywiście zastąp ścieżkę, w której sublime_textznajduje się plik wykonywalny.

openKomenda napotkał to starsza nazwa openvtpolecenia (niektóre dystrybucje tylko umieścić go pod nazwą openvt). openvtPolecenie tworzy nową wirtualną konsolę , która może być dokonana jedynie przez administratora i nie jest używane bardzo często w tym wieku, ponieważ większość ludzi tylko kiedykolwiek pracować w środowisku graficznym okna.


ale jeśli uruchomię polecenie „sublime_text indext.html„ Otrzymuję ten wynik ”sublime_text: polecenie nie zostało znalezione” Jak mogę rozwiązać ten problem?
Edgar Oliveira,

@EdgarOliveira Myślę, że widzę problem, najwyraźniej Sublime Text nie ma odpowiedniego pakietu? Zobacz moją edycję.
Gilles „SO- przestań być zły”

Stworzyłem do tego alias: alias sublimetext = '/ opt / sublime_text / sublime_text / home / user / Documents / sandbox / webdeveloper' ale kiedy wykonuję "sublimetext" otworzyłem dwa okna, zamiast tego tylko jedno! Dlaczego? Dzięki
Edgar Oliveira,

Kiedy zmieniłem plik .bashrc, mam wątpliwości „Jak zresetować plik .bashrc, aby móc wykonać nowy alias na tym samym terminalu, w którym dokonałem zmian?” Google go i znalazłem odpowiedź, w Uniksie i Linuksie, i tylko ty wykonałeś polecenie „bash”, a ty uruchomisz swój nowy alias :)
Edgar Oliveira

7

Nie wspominasz o używanym systemie operacyjnym.

W niektórych dystrybucjach Linuksa openpolecenie jest dowiązaniem symbolicznym do openvtpolecenia, które otwiera plik binarny w nowej konsoli wirtualnej. Najwyraźniej nie tego chcesz. Twoje komunikaty o błędach rzeczywiście wskazują, że wywołałeś openvtpolecenie. To polecenie oczekuje binarnego programu (pliku wykonywalnego) jako argumentu.

Zakładam, że masz na myśli, xdg-openco w przeciwieństwie do tego openvt, że nie oczekuje pliku wykonywalnego jako argumentu, ale plik skojarzony z programem i otwierający go wraz z programem. Możesz przekazać pliki i adresy URL jako argumenty.

Dlatego xdg-open index.htmlpowinien otworzyć plik w przeglądarce, xdg-open image.pngpowinien otworzyć plik w przeglądarce zdjęć itp.


1
Jedynym problemem jest to, że xdg-open otworzy plik w domyślnej aplikacji dla typu pliku. Nie możesz wybrać aplikacji za pomocą xdg-open. Nie wiem, czy istnieje polecenie wyboru aplikacji, ale jeśli znasz aplikację (jak w przykładzie „Sublime Text”), lepiej będzie wywołać program bezpośrednio.
X3MBoy

1
@ X3MBoy Ideą xdg-openpołączenia jest wywołanie domyślnej aplikacji dla tego pliku. Jeśli chcesz użyć innego programu, po prostu zadzwoń <program> <file>. Nie widzę problemu.
Marco

Poprosił o polecenie: open index.html -a "Sublime Text" -Dlatego mówię „problem”, ponieważ jeśli użyjesz xdg-opendo otwarcia pliku HTML, istnieje większe prawdopodobieństwo, że plik zostanie otwarty przez przeglądarkę, a nie przez edytor tekstu, taki jak „Sublime Text”
X3MBoy

3

Chociaż ludzie często nazywają xdg-openemulowanie funkcjonalności open, macOS openjest nieco inny, ponieważ 1. nie przekierowuje niczego ze stdout / stedrr i 2. odłącza wszystko, co chcesz uruchomić z terminala (co jest prawie zawsze tym, czego chcesz, uruchamiając GUI aplikacje, abyś nie miał wokół siebie terminali)

Aby rozwiązać ten problem, opracowałem odpowiedni ekwiwalent za pomocą standardowych narzędzi GNU (składnia to fish shell, ale konwersja na bash jest trywialna):

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

Dodano :

Dla tych, którzy używają powłoki bash, oto funkcja:

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

2

Moim rozwiązaniem (używanym na codzień) jest używanie aliasdla xdg-open.

Po prostu umieść to na ~/.bashrc:

alias open='xdg-open '

Następnie zamknij i uruchom ponownie powłokę lub source ~/.bashrc.

Teraz możesz otworzyć dowolny plik za pomocą tego polecenia ... od .png do .jpg do .docx do .pdf do .txt.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.