Come faccio ad aprire un file all'interno di uno script bash?


22

Ok, quindi la corsa gedit myfile.txtfunziona bene. Ma che dire dell'apertura di un file all'interno di uno script bash, utilizzando l'app desktop predefinita collegata al tipo di file?

Ho provato di seguito, che funziona benissimo quando eseguito manualmente nel terminale, ma quando lo inserisco in un file bash, non succede nulla:

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

Cosa dovrei fare invece?

Nota che ho bisogno che il file rimanga aperto anche dopo la chiusura del terminale.


1
prova a fornire il percorso del file .. e sei sicuro che dovrebbe essere tra virgolette? Prova senza virgolette
abhishek,

7
Sei sicuro che il comando non faccia nulla? Ho appena creato uno script con i contenuti che elenchi e si apre geditcon il file elencato (o apre una nuova scheda in una sessione esistente). Tuttavia, ritorna immediatamente, anziché bloccarsi fino alla chiusura del programma.
James Henstridge,

3
Inoltre, quali errori vengono visualizzati durante l'esecuzione dello script da un terminale?
Takkat,

Sì. Uso il percorso completo del file nel mio script ma l'ho rimosso qui per chiarire. Nessuna differenza con o senza virgolette. Ho provato xtg-opensu *.txt, *.htmle molto altro ancora - solo abituato lavoro.
Industriale

5
@abhishek: Non ci sono casi in cui le virgolette sono dannose in tali situazioni e molti casi in cui omettere le virgolette può causare problemi. È buona norma prendere l'abitudine di quotare sempre tutte le stringhe, anche quando non necessarie, a meno che non si abbia un motivo specifico per non farlo.
Scott Severance,

Risposte:


16

Penso che la tua sceneggiatura dovrebbe funzionare. Ma potresti aggiungere qualcosa per ottenere qualche informazione in più:

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

quando si esegue questo script (chiamato my_open.sh) in un terminale come questo:

my_open.sh path/to/somefile.txt

Ottengo il seguente output:

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

il che mi dice che il percorso del file è ok, il mimetype è riconosciuto e anche il file desktop utilizzato per aprire il file è ok. E gedit si apre con il file in questione.

Ora, quando eseguito su un altro file:

my_open.sh path/to/README

Ottengo il seguente output:

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

Nota il diverso mimetype e il file desktop mancante. Tuttavia, xdg-open apre l'impostazione predefinita per tutti i file di testo (gedit).

Quindi, potresti voler aggiungere qualcosa di simile al tuo script e vedere se ricevi un output imprevisto (che puoi quindi aggiungere alla tua domanda ...).


bene, tranne per il rumore finished scriptalla fine. Consiglio [ catb.org/~esr/writings/taoup/html/×(L'arte della programmazione Unix), la regola del silenzio. Btw .: I backtick sono deprecati - preferisci $ (...) invece, che è annidabile.
utente sconosciuto

2
bene, lo script ha lo scopo di fornire informazioni aggiuntive. Le informazioni fornite da "script finito" indicano che non è necessario nohupo &, ma ciò xdg-openritorna e consente di continuare.
Xubuntix,

Questo è il significato del prompt.
utente sconosciuto

3
vero. ho pensato che sarebbe stato più ovvio in quel modo. in realtà, l'intero script non è necessario, perché non lo fa più di quanto xdg-opennon lo sia già, quindi non si tratta comunque di uno script di qualità di produzione ...
xubuntix

5

Crea uno script bash test.sh come:

#!/bin/bash
gedit myfile.txt

Quindi, rendere lo script eseguibile come:

chmod +x test.sh

Infine, esegui lo script come:

./test.sh

Grazie per la tua risposta, ma sfortunatamente devo aprire l'editor di file predefinito di GNOME per il file come menzionato sopra.
Industriale

3

Forse gnome-open anziché xdg-open


Ho trovato che questa soluzione ha funzionato meglio
Jon,

Cosa succede se l'utente non è su Gnome?
Goddard,

2

Stai andando nella direzione corretta. Se vuoi che l'app gui rimanga aperta quando chiudi la finestra del terminale, devi solo aggiungere nohupa all'inizio della linea.

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

Se l'app gui non sta aprendo probabilmente è perché non hai la DISPLAYvariabile d'ambiente impostata nella shell da cui stai provando ad avviarla. Prova a fare un'eco$DISPLAY


3
xdg-open non richiede nohup&
xubuntix

0

La prima parte della tua domanda

con il comando catpuoi aprire un file all'interno del terminale, se è quello che vuoi (è indicato nella prima parte della tua domanda).

per usarlo puoi semplicemente digitare cat FILENAME.

Altre informazioni

Se hai bisogno di più comandi: ecco un buon elenco di comandi.

Editor predefinito di GNOME

Se si desidera aprire il file nell'applicazione predefinita di GNOME gedit.

per usarlo, basta digitare gedit FILENAME


Questo apre il file nel terminale, ma non l'editor predefinito di GNOME
Industrial il

@industrial ha modificato la mia risposta.
Alvar,

Sfortunatamente, neanche open funzionerà ...
Industriale

@Industrial Cosa stai chiedendo? spiega ulteriormente la tua domanda! dici molte cose diverse e io ho risposto a una di esse ma dici che non vuoi usarla ...
Alvar

@Industrial l'editor di testo predefinito in GNOME è gedit aka "editor di testo", quindi se corri aprirai il gedit file.filetypefile come vuoi!
Alvar,

0

Anche se non sono sicuro di cosa si debba veramente fare qui e sulla base di alcuni commenti recenti che un singolo script dovrebbe aprire QUALSIASI file nell'app predefinita o nella misura in cui l'app supporta questo.

In tal caso, il modo più semplice per farlo sarebbe quello di aprire un terminale e andare scriptname / path / to / nomefile o se ci sono spazi nel percorso allora scriptname '/ percorso / in / nomefile'

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

Usa questo come uno script, puoi usare qualsiasi nome tu desideri per lo script, userò openit1 come esempio. È meglio quando si usano gli script direttamente da ~ / bin per aggiungere un numero per nominare, quindi nessun conflitto con nessun comando linux esistente

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

Chiudi gedit e nel terminale

chmod u+x ~/bin/openit1

Riavvia per aggiungere ~ / bin al tuo $ PATH

Per invocare aprire un terminale e andare

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

IF come indicato da orig e utilizzo di orig. script per un determinato file per script e invocazione di d. facendo clic con il tasto sinistro del mouse sullo script devi solo selezionare " Esegui " anziché "Esegui nel terminale"


Restart to add ~/bin to your $PATH- uhm, vecchie abitudini di Windows? ;)
utente sconosciuto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.