Come eseguire uno script di shell in OS X facendo doppio clic?


233

Ho uno script di shell che ha i permessi di esecuzione dell'utente su OS X, ma quando faccio doppio clic su di esso, si apre in un editor di testo. Come posso farlo funzionare facendo doppio clic su di esso?

Risposte:


266
  • Per prima cosa nel terminale rendere eseguibile lo script digitando:

    chmod a+x (yourscriptname)
  • Quindi, nel Finder, fai clic con il pulsante destro del mouse sul file e seleziona "Apri con" e poi "Altro ...".

  • Qui si seleziona l'applicazione in cui si desidera eseguire il file, in questo caso sarebbe Terminale. Per poter selezionare il terminale è necessario passare da "Applicazioni consigliate" a "Tutte le applicazioni". (L'applicazione Terminal.app si trova nella cartella Utilità)

  • NOTA: a meno che non si desideri associare tutti i file con questa estensione per essere eseguiti nel terminale, non si dovrebbe selezionare "Sempre aperto con".

  • Dopo aver fatto clic su OK dovresti essere in grado di eseguire lo script semplicemente facendo doppio clic su di esso.

grazie ho capito, non sapevo di associarmi al terminale, pensavo che dovessi associarmi a / bin / sh
c2h2

22
Non sono riuscito a trovare Terminal.app nell'elenco finché non mi sono reso conto che dovevo cercare nella cartella "Utilità". Spero che questo salverà qualcuno un po 'di tempo.
Glenn Lawrence,

27
Su OSX 10.8 e versioni successive, uno script eseguibile i cui nomi non hanno suffisso o suffisso .commandè eseguibile di default da Finder, senza la necessità di istruire Finder su come aprirlo.
mklement0

1
"Tutte le applicazioni" è l'impostazione che mi mancava ... probabilmente anche quello di Cheruvim. Per quanto riguarda il commento di Glenn: puoi semplicemente usare la funzione di ricerca integrata nell'angolo in alto a destra della finestra; assicurati di digitare il nome completo dell'app, ad esempio Terminal.app.
anziano anziano

3
Non è il modo pulito per farlo. Rinomina lo script .commandnell'estensione del file.
Bachsau,

227

Hai provato a utilizzare l' .commandestensione del nome file?


3
Questo è meglio. Nella risposta @Lus la cartella di lavoro non è la stessa che si apre lo script.
Rodrigo,

6
Esiste un modo per avviare attività "in background" senza finestra della console?
lapo,

6
Tieni presente che la directory corrente potrebbe non essere quella in cui si trova il tuo script. Dai un'occhiata a questa domanda per impostarla correttamente: stackoverflow.com/questions/59895/…
Pavel Alexeev,

14
È ancora necessario disporre dell'autorizzazione di esecuzione ( chmod +x) ma l' .commandestensione è già collegata al Terminale. Ottima soluzione, grazie
NorTicUs

Apparentemente l'utente non può interagire con il programma terminale con questo metodo, a meno che non mi sbagli?
Demis,

153

A partire da OSX 10.10 (Yosemite) e almeno da OS X 10.8 (Mountain Lion) , il comportamento è il seguente quando si aprono (facendo doppio clic) script eseguibili dal Finder :

  • Script eseguibili [1] senza suffisso o suffisso .commandNO :
    • sono eseguiti di default - nessuna installazione richiesta :
      • si apre una nuova finestra Terminale in cui viene eseguito lo script.
      • per impostazione predefinita, la finestra rimarrà aperta al termine dello script in modo da poter ispezionare l'output (anche se a quel punto la shell che ha eseguito lo script è uscita e non è più possibile interagire con esso ).
        Tuttavia, tramite Terminal Preferences... > Profilespuoi scegliere di chiudere automaticamente la finestra quando lo script esce.
    • Caveat : la cartella di lavoro è sempre il dell'utente corrente cartella home , NON la cartella in cui si trova lo script.
      • Per fare in modo che uno script di shell cambi nella cartella in cui si trova, posizionalo
        • cd -- "$(dirname "$BASH_SOURCE")" subito dopo la linea di Shebang
        • o, se si deve rimanere conforme a POSIX, cd -- "$(dirname "$0")".
        • Per casi limite, come la ricerca della vera directory dei sorgenti di uno script con link simbolico , vedi questa mia risposta .
    • Se lo script è inaspettatamente non eseguibile :
      • Renderlo eseguibile eseguendo chmod +x <script>in Terminal; altrimenti, vedrai i seguenti sintomi:
      • .command: Finder visualizza un messaggio di errore fuorviante che suggerisce che il problema può essere risolto tramite File > Get Info, il che non è vero - utilizzare il chmod +xmetodo suggerito sopra.
      • nessun suffisso:
        • con una riga shebang (ad es. #!/bin/bash): il comportamento è come se il suffisso fosse .sh- vedi sotto.
        • con nessuna shebang: apre l'editor di testo predefinito (che è TextEdit per impostazione predefinita).
  • Script con suffisso.sh , eseguibile o meno:
    • vengono aperti per la modifica in TextEdit.appo, se installato, con Xcode.app.
  • Script con suffisso.scpt o .applescript(anche se sono essi stessi contrassegnati come eseguibili, che normalmente non è il caso):
    • aperto per la modifica in[Apple]Script Editor
    • Si noti che i file di codice sorgente JXA sembrano non avere ancora un suffisso distinto.
  • Script con un suffisso personalizzato (un suffisso non ancora noto al sistema), eseguibile o meno (in realtà, si applica a qualsiasi tipo di file):
    • ti chiede di aprirle con l'app quando le apri per la prima volta e ricorda quella scelta .

[1] Eseguibile significa: uno script con i bit di autorizzazione eseguibili impostati e l'utente chiamante - in relazione alla proprietà del file - quindi potenzialmente autorizzato a eseguirlo.
Se si utilizza chmod a+xper impostare tutti i bit di autorizzazione (che è tipico), chiunque può invocarlo (supponendo che anche loro siano autorizzati a leggere il file in base ai bit di autorizzazione di lettura e alla proprietà del file).


1
È possibile chiudere la finestra Terminale aperta quando lo script termina con un semplice che osascriptè possibile includere nel .commandfile invece di fare manualmente il pasticcio con il profilo.
L'

@ I'L'I: Intendi aggiungere un osascript -e '...'comando alla fine della sceneggiatura? Qual è il comando specifico e garantisce che la scheda corretta sia chiusa anche quando lo script non è in esecuzione nella scheda in primo piano?
mklement0,

5
@ mklement0: Sì, non l'ho testato per più di qualche minuto, ma l'idea di base è quella di includere nell'ultima riga dello script .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Potrebbe non funzionare in tutti gli scenari, anche se il reindirizzamento al end è davvero la chiave - altrimenti JavaScript può essere facilmente adattato (ad es. potrebbe essere necessario cambiare la finestra in tab se è il comportamento predefinito del terminale, ecc.).
L'1

È possibile non chiudere la finestra / scheda Terminale dopo l' .commandesecuzione del file di script nonostante l'impostazione del profilo?
CyberMew,

@CyberMew: se è possibile modificare lo script, aggiungere un comando che attende una sequenza di tasti alla fine; ad esempio, se si tratta di uno bashscript, aggiungere read -p 'Press Return to close this window.'come ultima istruzione.
mklement0

38

In alternativa, è possibile creare una normale applicazione Mac OS X dallo script utilizzando Platypus


Questa è davvero un'ottima app. Ma ho qualche problema qui. Ho uno script Python che voglio convertire in un file .app. Il mio script include una riga in cui l'utente deve digitare alcuni input (raw_input ()), quando .app raggiunge questa riga di codice, genera un errore EOF (fine del file). Cosa posso fare al riguardo?

1
Non è un terminale interattivo. Platypus presenta semplicemente l'output dello script. Non c'è comunicazione bidirezionale.
svth

4
Oppure crea un'applicazione OS X con Automator usando l'azione Esegui script shell.
Rangi Keen,

15

Il modo più semplice è cambiare l'estensione in .commando nessuna estensione.

Ma questo aprirà il Terminale e dovrai chiuderlo. Se non si desidera visualizzare alcun output, è possibile utilizzare Automator per creare un'applicazione Mac che è possibile fare doppio clic, aggiungere al dock, ecc.

  1. Apri l' Automatorapplicazione
  2. Scegli il tipo di "Applicazione"
  3. Digita "esegui" nella casella di ricerca Azioni
  4. Fare doppio clic su "Esegui script shell"
  5. Fai clic sul Runpulsante nell'angolo in alto a destra per testarlo.
  6. File > Save per creare l'applicazione.

inserisci qui la descrizione dell'immagine


Grande ! Come possiamo automatizzare l'esecuzione di questo flusso di lavoro ogni giorno alle 13:00?
iAkshay,

9

Non è necessario utilizzare app di terze parti come Platypus.

Basta creare uno script Apple con Script Editor e utilizzare il comando do shell script "shell commands"per chiamate di comando dirette o file di script di shell eseguibili, mantenere il file di script modificabile al sicuro da qualche parte, quindi esportarlo per creare uno script dell'applicazione. lo script dell'app può essere avviato facendo doppio clic o selezione nella cartella della barra.


3
Ancora meglio, usa Automator e usa l'azione Esegui script shell direttamente anziché tramite Apple Script.
Rangi Keen,

0

Puoi anche impostare i valori predefiniti per estensione del file usando RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

potenzialmente potresti impostare .sh per aprirlo in iTerm / Terminal ecc. avrebbe bisogno delle autorizzazioni di esecuzione dell'utente, ad es

chmod u+x filename.sh

Riquadro pref di RCDefaultApp


0

chmod 774 filename

Nota : il file con nome 'nome file' con lo script bash non ha estensione

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.