Jak mogę otworzyć plik z poziomu skryptu bash?

22

Ok, więc bieganie gedit myfile.txtdziała dobrze. Ale co z otwieraniem pliku z poziomu skryptu bash przy użyciu domyślnej aplikacji komputerowej powiązanej z typem pliku?

Próbowałem poniżej, który działa świetnie, gdy uruchamiany ręcznie w terminalu, ale kiedy umieszczam go w pliku bash, nic się nie dzieje:

#!/bin/bash
xdg-open "myfile.txt"&

Co powinienem zamiast tego zrobić?

Pamiętaj, że plik musi pozostać otwarty także po zamknięciu terminala.

Przemysłowy
źródło
1
spróbuj podać ścieżkę do pliku ... i jesteś pewien, że powinna zawierać cudzysłowy? Spróbuj bez cytatów
abhishek
7
Czy jesteś pewien, że polecenie nic nie robi? Właśnie utworzyłem skrypt z zawartością, którą wymieniasz, i otwiera się on geditz wymienionym plikiem (lub otwiera nową kartę w istniejącej sesji). Jednak natychmiast wraca, zamiast blokować, aż program zakończy działanie.
James Henstridge
3
Ponadto jakie błędy występują podczas uruchamiania skryptu z terminala?
Takkat
Tak. Używam pełnej ścieżki do pliku w skrypcie, ale usunąłem go tutaj, aby to wyjaśnić. Bez różnicy z cytatami lub bez. Próbowałem xtg-openna *.txt, *.htmli więcej - po prostu przyzwyczajenie praca.
Przemysł
5
@abhishek: Nie ma przypadków, w których cytaty są szkodliwe w takich sytuacjach, i wiele przypadków, w których pominięcie cytatów może powodować problemy. Dobrą praktyką jest nawyk ciągłego cytowania wszystkich ciągów, nawet gdy jest to niepotrzebne, chyba że masz konkretny powód, aby tego nie robić.
Scott Severance

Odpowiedzi:

16

Myślę, że twój skrypt powinien działać. Ale możesz coś dodać, aby uzyskać trochę więcej informacji:

#!/bin/bash
T=`xdg-mime query filetype $1`
echo "opening file "  $1  " of type " $T "with " `xdg-mime query default $T`
xdg-open $1
echo "finished script"

podczas uruchamiania tego skryptu (o nazwie my_open.sh) w terminalu takim jak ten:

my_open.sh path/to/somefile.txt

Otrzymuję następujące dane wyjściowe:

opening file  path/to/somefile.txt  of type  text/plain with  gedit.desktop
finished script

co mówi mi, że ścieżka do pliku jest w porządku, typ mimetyczny jest rozpoznawany, a plik pulpitu używany do otwierania pliku jest również w porządku. I gedit otwiera się z danym plikiem.

Teraz po uruchomieniu na innym pliku:

my_open.sh path/to/README

Otrzymuję następujące dane wyjściowe:

opening file  path/to/README  of type  text/x-readme with
finished script

Zwróć uwagę na inny typ mimetatu i brakujący plik na pulpicie. Niemniej jednak xdg-open otwiera domyślną wartość dla wszystkich plików tekstowych (gedit).

Możesz więc dodać coś takiego do skryptu i sprawdzić, czy otrzymasz nieoczekiwany wynik (który możesz następnie dodać do pytania ...).

xubuntix
źródło
w porządku, z wyjątkiem hałaśliwego finished scriptkońca. Polecam [ catb.org/~esr/writings/taoup/html/](The art of Unix Programming), zasadę ciszy. Btw .: Backticks są przestarzałe - zamiast tego preferuj $ (...), który można zagnieżdżać.
użytkownik nieznany
2
Cóż, skrypt ma na celu dostarczenie dodatkowych informacji. Informacje podane w „gotowym skrypcie” są takie, że nie potrzebujesz nohuplub &, ale to xdg-openzwraca i pozwala kontynuować.
xubuntix
Do tego właśnie służy monit.
użytkownik nieznany
3
prawdziwe. pomyślałem, że w ten sposób będzie to bardziej oczywiste. tak naprawdę cały skrypt nie jest potrzebny, ponieważ nie robi więcej niż xdg-openjuż, więc i tak nie jest to skrypt jakości produkcyjnej ...
xubuntix
5

Wykonaj skrypt bash test.sh jako:

#!/bin/bash
gedit myfile.txt

Następnie ustaw skrypt jako wykonywalny jako:

chmod +x test.sh

Na koniec uruchom skrypt jako:

./test.sh
czekolada
źródło
Dziękuję za odpowiedź, ale niestety muszę otworzyć domyślny edytor plików GNOME dla pliku, jak wspomniano powyżej.
Przemysłowy
3

Może gnome-open zamiast xdg-open

Denis
źródło
Uważam, że to rozwiązanie działa najlepiej
Jon
Co się stanie, jeśli użytkownika nie ma w Gnome?
Goddard
2

Idziesz w dobrym kierunku. Jeśli chcesz, aby aplikacja GUI pozostawała otwarta po zamknięciu okna terminala, musisz po prostu dodać znak nohupna początku linii.

#!/bin/bash
nohup xdg-open "myfile.txt"&

Jeśli aplikacja GUI nie otwiera się, prawdopodobnie dlatego, że nie masz DISPLAYustawionej zmiennej środowiskowej w powłoce, z której próbujesz ją uruchomić. Spróbuj wykonać echo$DISPLAY

znak
źródło
3
xdg-open nie wymaga nohupani&
xubuntix
0

Pierwsza część twojego pytania

za pomocą polecenia catmożesz otworzyć plik w terminalu, jeśli tego właśnie chcesz (jest to określone w pierwszej części pytania).

aby z niego skorzystać, wystarczy wpisać cat FILENAME.

Inne informacje

Jeśli potrzebujesz więcej poleceń: Oto dobra lista poleceń.

Domyślny edytor GNOME

Jeśli chcesz otworzyć plik w domyślnej aplikacji GNOME gedit.

aby z niego skorzystać, po prostu wpisz gedit FILENAME

Alvar
źródło
To otwiera plik w terminalu, ale nie jest domyślnym edytorem GNOME
Industrial
@industrial zredagował moją odpowiedź.
Alvar
Niestety, otwarte nie zadziała albo ...
Przemysł
@Przemysł O co prosisz? wyjaśnij swoje pytanie dalej! mówisz kilka różnych rzeczy, a ja odpowiedziałem na jedną z nich, ale mówisz, że nie chcesz jej używać ...
Alvar
@Przemysłowy domyślny edytor tekstu w GNOME to gedit alias „edytor tekstu”, więc jeśli uruchomisz gedit file.filetype, otworzysz plik tak, jak chcesz!
Alvar
0

Chociaż nie jestem pewien, co naprawdę należy tutaj osiągnąć i na podstawie niektórych ostatnich komentarzy, że pojedynczy skrypt powinien otwierać DOWOLNY plik w domyślnej aplikacji lub w jakim zakresie aplikacja to obsługuje.

Jeśli tak, to najłatwiejszym sposobem na to jest otwarcie terminalu i przejście do nazwy skryptu / ścieżka / do / nazwa pliku lub jeśli w ścieżce znajdują się spacje, wówczas nazwa skryptu „/ ścieżka / do / nazwa pliku”

cd; mkdir -p bin && gedit ~/bin/openit1

Użyj tego jako skryptu, możesz użyć dowolnej nazwy skryptu, użyję openit1 jako przykładu. Najlepiej jest używać skryptów bezpośrednio z ~ / bin, aby dodać liczbę do nazwy, aby nie było konfliktu z żadnymi istniejącymi poleceniami Linuksa

#!/bin/bash
xdg-open "$1"

Zamknij gedit i w terminalu

chmod u+x ~/bin/openit1

Uruchom ponownie, aby dodać ~ / bin do $ PATH

Aby wywołać, otwórz terminal i idź

openit1 /path/to/filename or openit1 'path/to/filename' 

JEŻELI jak podano w oryginale i używając orig. skrypt dla jednego konkretnego pliku na skrypt i wywoływanie przez d. klikając lewym przyciskiem na skrypt wystarczy wybrać „ Uruchom ” zamiast „Uruchom w terminalu”

doug
źródło
Restart to add ~/bin to your $PATH- uhm, stare nawyki Windows? ;)
użytkownik nieznany