2010-08-17 13 views
5

Ho il seguente scriptCome passare una variabile FROM applescript a uno script di shell?

#!/bin/bash 
/usr/bin/osascript << EOT 
set myfile to choose file 
EOT 

no_ext=$(python -c "print '$myfile'.split('.')[0]") 

### this works - just need to know how to pass the arg 
R CMD Sweave no_ext.Rnw 
pdflatex no_ext.tex 
open no_ext.pdf 

qualcuno mi può indicare "come passare il myfile variabili correttamente"?

EDIT Thx per tutti i suggerimenti!

Non so cosa accettare, tutte le tue risposte mi hanno davvero aiutato poiché ho imparato molto da tutti.

+0

Perché non scrivere tutto sia in bash o AppleScript? perché questa complessità? – ghostdog74

+0

Semplicemente perché non ho idea di come usare una finestra della GUI e ottenere il suo argomento (file selezionato) sul mio script della shell, senza usare lo script Apple. Ho letto su Cocoadialog, ma mi servirebbero strumenti aggiuntivi da installare che non funzionano per me, perché anche i colleghi dovrebbero essere in grado di usarlo. –

risposta

5

I seguenti problemi esistono nello script:

Un insieme variabile nella sezione AppleScript fa diventare definita nello script shell racchiude. Devi fare lo scambio di dati con lo script della shell usando la sostituzione di comando.

AppleScripts richiamato da uno script di shell non può interagire con l'utente perché non ha un contesto di applicazione. È possibile utilizzare l'applicazione di supporto "AppleScript Runner" per eseguire i comandi di interazione dell'utente.

Ecco una versione rivista dello script in cui vengono fissati questi problemi:

#!/bin/bash 

myfile=$(/usr/bin/osascript << EOT 
tell app "AppleScript Runner" 
    activate 
    return posix path of (choose file) 
end 
EOT) 

if [ $? -eq 0 ] 
then 
    echo $myfile 
else 
    echo "User canceled" 
fi 
+0

+1 per il ragionamento. anche se l'ho già fatto a modo mio, usando: mkdir -p foo.app/Contents/MacOS mv foo.sh foo.app/Contents/MacOS/foo chmod + x foo.app/Contents/MacOS/foo –

+0

scusa, puoi spiegare $? -eq 0 se clausola? grazie! –

+0

accettato questo perché era più vicino a quello che ho usato alla fine –

2

Innanzitutto, è necessario ottenere il contenuto della variabile myfile da Applescript a bash. Non conosco Applescript, quindi farò una ripresa al buio su come scrivere sul suo output standard. Quindi la parte python è solo una complessità inutile (e probabilmente sbagliata comunque, stavi buttando via tutto dopo il primo . piuttosto che l'ultimo). Successivamente è necessario un $ prima del nome della variabile nella sintassi bash. Credo che il seguente script fa quello che vuoi: (. set -e all'inizio fa subito l'uscita shell se si verifica un errore, invece di cercare di eseguire pdflatex anche se nessun file .tex è stato prodotto o somesuch)

#!/bin/sh 
set -e 
myfile=$(osascript <<EOT 
set myfile to choose file 
write myfile to stdout 
EOT 
) 
no_ext="${myfile%.*}" 
R CMD Sweave "$no_ext.Rnw" 
pdflatex "$no_ext.tex" 
open "$no_ext.pdf" 

+0

Questo non funziona, semplicemente perché l'oScript che apre la finestra di dialogo non viene eseguito. Mi serve per selezionare il file –

+0

@ ran2: lo script di shell che ho scritto invoca 'oascript', ma il bit di Applescript potrebbe essere sbagliato poiché non conosco Applescript. Cosa vedi se sostituisci 'set -e' con' set -ex' (questo fa sì che la shell stampi una traccia di esecuzione)? – Gilles

+0

dice: ++ oascript ./test2: riga 7: oScript: comando non trovato + myfile = –

2

Realizzare che i percorsi di mele sono due punti ":" delimitati. Hai bisogno di una barra delimitata in bash così nei termini di applescript che è il "percorso posix". Inoltre, quando si utilizza osascript non è possibile aprire finestre di dialogo. Devi dire a un'applicazione di aprire la finestra. Successivamente, si "restituisce" qualcosa dal applescript ... questo è ciò che va a bash. Infine, bash per eseguire un comando e assegnare il risultato a una variabile usa `` attorno al comando. Quindi, sapendo questo, ecco uno script di shell per usare un applescript per ottenere la variabile myFile.

#!/bin/bash 

myFile=`/usr/bin/osascript << EOT 
tell application "Finder" 
activate 
set myfile to choose file with prompt "Select the file to use in bash!" 
end tell 
return (posix path of myfile) 
EOT` 

echo $myFile 
+0

Questo funziona anche per me poiché ho eluso il problema descritto da sakra (vedi commento) –

Problemi correlati