Comment ouvrir un fichier depuis un script bash?

22

Ok, donc courir gedit myfile.txtfonctionne bien. Mais qu'en est-il de l'ouverture d'un fichier à partir d'un script bash, en utilisant l'application de bureau par défaut liée au type de fichier?

J'ai essayé ci-dessous, ce qui fonctionne très bien lorsqu'il est exécuté manuellement dans le terminal, mais quand je le mets dans un fichier bash, rien ne se passe:

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

Que dois-je faire à la place?

Veuillez noter que j'ai également besoin que le fichier reste ouvert après la fermeture du terminal.

Industriel
la source
1
essayez de fournir le chemin du fichier .. et êtes-vous sûr qu'il devrait être accompagné de guillemets? Essayez sans guillemets
abhishek
7
Êtes-vous sûr que la commande ne fait rien? Je viens de créer un script avec le contenu que vous listez, et il s'ouvre geditavec le fichier répertorié (ou ouvre un nouvel onglet dans une session existante). Il revient cependant immédiatement, plutôt que de bloquer jusqu'à la fin du programme.
James Henstridge
3
De plus, quelles erreurs obtenez-vous lors de l'exécution de votre script à partir d'un terminal?
Takkat
Oui. J'utilise le chemin complet du fichier dans mon script mais je l'ai supprimé ici pour clarifier. Aucune différence avec ou sans guillemets. Je l' ai essayé xtg-opensur *.txt, *.htmlet plus - juste ne fonctionnera pas.
Industrial
5
@abhishek: Il n'y a aucun cas où les guillemets sont nuisibles dans de telles situations, et beaucoup de cas où l'omission de guillemets peut causer des problèmes. C'est une bonne pratique de prendre l'habitude de toujours citer toutes les chaînes, même lorsque cela n'est pas nécessaire, sauf si vous avez une raison spécifique de ne pas le faire.
Scott Severance

Réponses:

16

Je pense que votre script devrait fonctionner. Mais vous pourriez y ajouter quelque chose pour obtenir un peu plus d'informations:

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

lors de l'exécution de ce script (nommé my_open.sh) dans un terminal comme celui-ci:

my_open.sh path/to/somefile.txt

J'obtiens la sortie suivante:

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

ce qui m'indique que le chemin d'accès au fichier est correct, le type MIME est reconnu et le fichier de bureau qui est utilisé pour ouvrir le fichier est également correct. Et gedit s'ouvre avec le fichier en question.

Maintenant, lorsque exécuté sur un autre fichier:

my_open.sh path/to/README

J'obtiens la sortie suivante:

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

Notez le type de mime différent et le fichier de bureau manquant. Néanmoins, xdg-open ouvre la valeur par défaut pour tous les fichiers texte (gedit).

Donc, vous voudrez peut-être ajouter quelque chose comme ça à votre script et voir si vous obtenez une sortie inattendue (que vous pouvez ensuite ajouter à votre question ...).

xubuntix
la source
bien, sauf pour le bruyant finished scriptà la fin. Je recommande [ catb.org/~esr/writings/taoup/html/[(L'art de la programmation Unix), la règle du silence. Btw .: Les backticks sont déconseillés - préférez $ (...) à la place, qui est emboîtable.
utilisateur inconnu
2
eh bien, le script est destiné à donner des informations supplémentaires. Les informations fournies par «script terminé» sont que vous n'avez pas besoin de nohupou &, mais cela xdg-openrevient et vous permet de continuer.
xubuntix
C'est à cela que sert l'invite.
utilisateur inconnu
3
vrai. pensais juste que ce serait plus évident de cette façon. en fait, le script entier n'est pas nécessaire, car il ne le fait pas plus que xdg-opendéjà, donc ce n'est pas un script de qualité de production de toute façon ...
xubuntix
5

Créez un script bash test.sh comme:

#!/bin/bash
gedit myfile.txt

Ensuite, rendez le script exécutable en tant que:

chmod +x test.sh

Enfin, exécutez le script en tant que:

./test.sh
choc
la source
Merci pour votre réponse, mais malheureusement j'ai besoin d'ouvrir l'éditeur de fichiers par défaut de GNOME pour le fichier comme mentionné ci-dessus.
Industriel
3

Peut - être gnome-open au lieu de xdg-open

Denis
la source
J'ai trouvé que cette solution fonctionnait le mieux
Jon
Et si l'utilisateur n'est pas sur Gnome?
Goddard
2

Vous allez dans la bonne direction. Si vous souhaitez que l'application gui reste ouverte lorsque vous fermez la fenêtre du terminal, il vous suffit d'ajouter un nohupau début de la ligne.

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

Si l'application gui ne s'ouvre pas, c'est probablement parce que la DISPLAYvariable d'environnement n'est pas définie dans le shell à partir de laquelle vous essayez de la lancer. Essayez de faire un écho$DISPLAY

marque
la source
3
xdg-open ne nécessite nohupni&
xubuntix
0

La première partie de votre question

avec la commande catvous pouvez ouvrir un fichier à l'intérieur du terminal, si c'est ce que vous voulez (c'est indiqué dans la première partie de votre question).

pour l'utiliser, vous pouvez simplement taper cat FILENAME.

Les autres informations

Si vous avez besoin de plus de commandes: Voici une bonne liste de commandes.

Éditeur par défaut GNOME

Si vous souhaitez ouvrir le fichier dans l'application par défaut de GNOME gedit.

pour l'utiliser, tapez simplement gedit FILENAME

Alvar
la source
Cela ouvre le fichier dans le terminal, mais pas l'éditeur par défaut de GNOME
Industrial
@industrial a modifié ma réponse.
Alvar
Malheureusement, ouvert ne fonctionnera pas non plus ...
Industrial
@Industrial Que demandez-vous? expliquez votre question plus en détail! vous dites plusieurs choses différentes et j'ai répondu à l'une d'entre elles mais vous dites que vous ne voulez pas l'utiliser ...
Alvar
@Industrial, l'éditeur de texte par défaut dans GNOME est gedit aka "éditeur de texte", donc si vous exécutez, gedit file.filetypevous ouvrirez le fichier comme vous le souhaitez!
Alvar
0

Bien que je ne sois pas sûr de ce qui doit vraiment être accompli ici et sur la base de certains commentaires récents qu'un seul script devrait ouvrir N'IMPORTE QUEL fichier dans l'application par défaut ou dans quelle mesure l'application prend en charge cela.

Si c'est le cas, alors la façon la plus simple de le faire serait d'ouvrir un terminal et d'aller scriptname / path / to / filename ou s'il y a des espaces dans path, alors scriptname '/ path / to / filename'

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

Utilisez-le comme un script, vous pouvez utiliser n'importe quel nom que vous souhaitez pour le script, je vais utiliser openit1 comme exemple. Il est préférable d'utiliser des scripts directement à partir de ~ / bin pour ajouter un nombre à nommer, donc aucun conflit avec les commandes Linux existantes

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

Fermer gedit & dans le terminal

chmod u+x ~/bin/openit1

Redémarrez pour ajouter ~ / bin à votre $ PATH

Pour invoquer ouvrir un terminal et aller

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

SI comme orig indiqué & en utilisant l'orig. script pour un fichier particulier par script et invocation par d. clic gauche sur le script il vous suffit de choisir " Exécuter " au lieu de "Exécuter dans le terminal"

doug
la source
Restart to add ~/bin to your $PATH- euh, les vieilles habitudes de Windows? ;)
utilisateur inconnu