2013-06-06 11 views
8

Sto provando a far funzionare questo script. È uno script Bash che ha lo scopo di prendere alcune variabili, metterle insieme e utilizzare il risultato per inviare un comando AppleScript. Incollare manualmente la stringa echoed dalla variabile dietro il osascript -e al terminale funziona come voglio e me lo aspetto. Ma quando provo a combinare il comando osascript -e e la stringa to_osa, non funziona. Come posso fare questo lavoro?Combinare le variabili in Bash per formare un comando inviato ad AppleScript usando il comando osascript

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
delimiter="'" 
to_osa=${delimiter}${the_script}${the_url}${delimiter} 
echo ${to_osa} 
osascript -e ${to_osa} 

Oltre a lavorare manualmente lo script funziona anche quando scrivo il comando desiderato ad uno script e quindi eseguirlo:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh 
sh ~/Desktop/outputfile.sh 

risposta

2

Come regola generale, non mettere tra virgolette in la variabile, metterli intorno alla variabile. In questo caso è più complicato, dal momento che hai alcune virgolette per le citazioni a livello bash e altre per le citazioni a livello di AppleScript; in questo caso, le quotazioni AppleScript livello Vai nella variabile, le quotazioni a livello bash vanno in giro la variabile:

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
osascript -e "${the_script}${the_url}" 

BTW, utilizzando echo per controllare le cose come questo è altamente fuorviante. echo ti dice cosa c'è nella variabile, non cosa verrà eseguito quando fai riferimento alla variabile su una riga di comando. La più grande differenza è che echo stampa i suoi argomenti dopo hanno passato l'analisi di bash (preventivo e rimozione di escape, ecc.), Ma quando si dice "Incollare manualmente la stringa ... funziona" si sta dicendo che è ciò che si desidera prima dell'analisi. Se le virgolette sono presenti nella stringa echo, significa che bash non le ha riconosciute come virgolette e le rimuove. Confronta:

string='"quoted string"' 
echo $string   # prints the string with double-quotes around it because bash doesnt't recognize them in a variable 
echo "quoted string" # prints *without* quotes because bash recognizes and removes them 
11

Il codice eseguibile per il mashing di stringhe è soggetto a errori e cattivo e non è assolutamente necessario. E 'banale per passare gli argomenti a un AppleScript definendo un esplicito 'run' handler:

on run argv -- argv is a list of strings 
    -- do stuff here 
end run 

che poi richiama in questo modo:

osascript -e /path/to/script arg1 arg2 ... 

A proposito, se lo script richiede un numero fisso di argomenti, si scrive anche così:

on run {arg1, arg2, ...} -- each arg is a string 
    -- do stuff here 
end run 

...

Andando oltre, si può anche fare l'Apple Script direttamente eseguibile come faresti con qualsiasi altro script di shell. In primo luogo, aggiungere un hashbang come segue:

#!/usr/bin/osascript 

on run argv 
    -- do stuff here 
end run 

quindi salvarlo in formato testo normale non compilato e gestito chmod +x /path/to/myscript per rendere il file eseguibile. È quindi possibile eseguirlo dalla shell come segue:

/path/to/myscript arg1 arg2 ... 

Oppure, se non si desidera specificare il percorso completo ogni volta, inserire il file nella /usr/local/bin o qualche altra directory che è il PATH della shell:

myscript arg1 arg2 ... 

...

Quindi, ecco come si dovrebbe scrivere lo script originale:

#!/bin/sh 
the_url="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash" 
osascript -e 'on run {theURL}' -e 'tell application "Safari" to set URL of document 1 to theURL' -e 'end run' $the_url 

rapido, semplice e molto robusta.

-

p.s. Se preferisci aprire un URL in una nuova finestra invece di uno esistente, consulta la manpage per lo strumento open di OS X.

+0

perché the_url diventa theURL? –

+1

abitudini; chiamalo come vuoi – foo

+1

E se uno desidera che srcipt di Apple esegua lo script di shell che dipende dalle variabili? Per esempio. osascript -e 'fa shell script \ "echo $ the_url \"'. – lef

Problemi correlati