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.


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 ...).


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

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


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


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


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”


Restart to add ~/bin to your $PATH- uhm, stare nawyki Windows? ;)
— użytkownik nieznany
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.