Wie öffne ich eine Datei in einem Bash-Skript?

22

Ok, so läuft es gedit myfile.txtgut. Wie sieht es aber mit dem Öffnen einer Datei aus einem Bash-Skript mit der mit dem Dateityp verknüpften Standard-Desktop-App aus?

Ich habe unten versucht, was großartig funktioniert, wenn es manuell im Terminal ausgeführt wird, aber wenn ich es in eine Bash-Datei lege, passiert nichts:

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

Was soll ich stattdessen tun?

Bitte beachten Sie, dass die Datei auch nach dem Schließen des Terminals geöffnet bleiben muss.

Industrie
quelle
1
Versuchen Sie, den Pfad der Datei anzugeben. Sind Sie sicher, dass er in Anführungszeichen steht? Versuchen Sie es ohne Anführungszeichen
abhishek
7
Sind Sie sicher, dass der Befehl nichts bewirkt? Ich habe gerade ein Skript mit den Inhalten erstellt, die Sie geditauflisten , und es wird mit der aufgelisteten Datei geöffnet (oder es wird eine neue Registerkarte in einer vorhandenen Sitzung geöffnet). Es kehrt jedoch sofort zurück, anstatt zu blockieren, bis das Programm beendet wird.
James Henstridge
3
Welche Fehler treten außerdem auf, wenn Sie Ihr Skript von einem Terminal aus ausführen?
Takkat
Ja. Ich verwende den vollständigen Pfad zu der Datei in meinem Skript, entferne ihn jedoch hier, um dies zu verdeutlichen. Kein Unterschied mit oder ohne Anführungszeichen. Ich habe versucht , xtg-openauf *.txt, *.htmlund mehr - einfach nicht funktionieren.
Industrial
5
@abhishek: Es gibt keine Fälle, in denen Anführungszeichen in solchen Situationen schädlich sind, und viele Fälle, in denen das Auslassen von Anführungszeichen Probleme verursachen kann. Es ist eine gute Gewohnheit, immer alle Zeichenfolgen zu zitieren, auch wenn dies unnötig ist, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun.
Scott Severance

Antworten:

16

Ich denke dein Skript sollte funktionieren. Sie können jedoch etwas hinzufügen, um ein wenig mehr Informationen zu erhalten:

#!/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"

Wenn Sie dieses Skript (mit dem Namen my_open.sh) in einem Terminal wie folgt ausführen:

my_open.sh path/to/somefile.txt

Ich erhalte folgende Ausgabe:

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

das sagt mir, dass der Pfad zur Datei in Ordnung ist, der Mimetyp erkannt wird und die Desktopfile, die zum Öffnen der Datei verwendet wird, ebenfalls in Ordnung ist. Und gedit öffnet sich mit der fraglichen Datei.

Nun, wenn auf einer anderen Datei ausgeführt:

my_open.sh path/to/README

Ich erhalte folgende Ausgabe:

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

Beachten Sie den unterschiedlichen Mimetyp und die fehlende Desktop-Datei. Trotzdem öffnet xdg-open den Standard für alle Textdateien (gedit).

Vielleicht möchten Sie Ihrem Skript etwas Ähnliches hinzufügen und prüfen, ob Sie eine unerwartete Ausgabe erhalten (die Sie dann Ihrer Frage hinzufügen können ...).

xubuntix
quelle
gut, bis auf die lauten finished scriptam Ende. Ich empfehle [ catb.org/~esr/writings/taoup/html/) (Die Kunst der Unix-Programmierung), die Regel der Stille. Übrigens: Backticks sind veraltet - bevorzugen Sie stattdessen $ (...), was verschachtelbar ist.
Benutzer unbekannt
2
Nun, das Skript soll zusätzliche Informationen geben. Die Information, die durch 'fertiges Skript' gegeben wird, ist, dass Sie nicht nohupoder brauchen &, aber das xdg-openkehrt zurück und lässt Sie fortfahren.
Xubuntix
Dafür ist die Eingabeaufforderung gedacht.
Benutzer unbekannt
3
wahr. dachte nur, dass es auf diese Weise offensichtlicher wäre. Tatsächlich wird das gesamte Skript nicht benötigt, da es nicht mehr als xdg-openbereits benötigt wird. Dies ist also sowieso kein Skript in Produktionsqualität ...
xubuntix
5

Erstellen Sie ein Bash-Skript test.sh als:

#!/bin/bash
gedit myfile.txt

Dann machen Sie das Skript ausführbar als:

chmod +x test.sh

Führen Sie das Skript abschließend wie folgt aus:

./test.sh
choc
quelle
Vielen Dank für Ihre Antwort, aber leider muss ich den Standard-Datei-Editor von GNOME für die oben genannte Datei öffnen.
Industrial
3

Vielleicht gnome-open statt xdg-open

Denis
quelle
Ich fand diese Lösung am besten
Jon
Was ist, wenn der Benutzer nicht auf Gnome ist?
Goddard
2

Sie gehen in die richtige Richtung. Wenn Sie möchten, dass die GUI-App beim Schließen des Terminalfensters geöffnet bleibt, müssen Sie nur ein nohupam Zeilenanfang hinzufügen .

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

Wenn die GUI-App nicht geöffnet wird, ist dies wahrscheinlich darauf zurückzuführen, dass Sie die DISPLAYUmgebungsvariable nicht in der Shell festgelegt haben, über die Sie sie starten möchten. Versuche ein Echo zu machen$DISPLAY

Kennzeichen
quelle
3
xdg-open erfordert weder nohupnoch&
xubuntix
0

Der erste Teil Ihrer Frage

Mit dem Befehl können catSie eine Datei im Terminal öffnen, wenn Sie dies möchten (dies steht im ersten Teil Ihrer Frage).

Um es zu benutzen, können Sie einfach eingeben cat FILENAME.

Andere Informationen

Wenn Sie weitere Befehle benötigen: Hier ist eine gute Liste von Befehlen.

GNOME-Standardeditor

Wenn Sie die Datei in der Standardanwendung von GNOME öffnen möchten gedit.

Um es zu benutzen, tippe einfach gedit FILENAME

Alvar
quelle
Das öffnet die Datei im Terminal, aber nicht den Standardeditor von GNOME
Industrial.
@industrial hat meine Antwort bearbeitet.
Alvar
Leider funktioniert Open auch nicht ...
Industrial
@Industrial Wonach fragst du? erkläre deine Frage weiter! Sie sagen mehrere verschiedene Dinge und ich habe eines davon beantwortet, aber Sie sagen, Sie wollen es nicht benutzen ...
Alvar
@Industrial Der Standard-Texteditor in GNOME ist gedit alias "Texteditor". Wenn Sie ihn ausführen gedit file.filetype, öffnen Sie die Datei so, wie Sie möchten!
Alvar
0

Ich bin mir zwar nicht sicher, was hier wirklich erreicht werden soll, aber basierend auf einigen jüngsten Kommentaren, dass ein einzelnes Skript JEDE Datei in der Standard-App öffnen sollte oder soweit die App dies unterstützt.

Wenn ja, ist dies am einfachsten, indem Sie ein Terminal öffnen und Skriptname / Pfad / nach / Dateiname eingeben oder wenn Pfad Leerzeichen enthält, Skriptname '/ Pfad / nach / Dateiname'.

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

Verwenden Sie dies als Skript. Sie können einen beliebigen Namen für das Skript verwenden. Ich verwende openit1 als Beispiel. Es ist am besten, wenn Sie Skripte direkt von ~ / bin verwenden, um eine Nummer als Namen hinzuzufügen, damit keine Konflikte mit vorhandenen Linux-Befehlen auftreten

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

Schließen Sie gedit & im Terminal

chmod u+x ~/bin/openit1

Starten Sie neu, um ~ / bin zu Ihrem $ PATH hinzuzufügen

Zum Aufrufen ein Terminal öffnen und loslegen

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

WENN wie orig angegeben & mit orig. Skript für eine bestimmte Datei pro Skript & Aufruf von d. Klicken Sie mit der linken Maustaste auf das Skript, und wählen Sie " Ausführen " anstelle von "Im Terminal ausführen".

doug
quelle
Restart to add ~/bin to your $PATH- ähm, alte Windows-Gewohnheiten? ;)
Benutzer unbekannt