6
votes

Comment passer une variable de AppleScript à un script shell?

J'ai le script suivant

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


2 commentaires

Pourquoi n'écrivez-vous pas tout dans BASH ou App AppleScript? Pourquoi cette complexité?


Tout simplement parce que je n'ai aucune idée de l'utilisation d'une fenêtre de fenêtre d'interface graphique et d'obtenir son argument (fichier sélectionné) à mon script shell, sans utiliser le script Apple. J'ai lu sur CocoDialog, mais cela nécessiterait des outils supplémentaires à installer, ce qui ne fonctionne pas pour moi, car les collègues devraient également être en mesure de l'utiliser.


3 Réponses :


2
votes

Tout d'abord, vous devez obtenir le contenu de la variable myfile de AppleScript à bash. Je ne connais pas AppleScript, je vais donc faire un tir dans le noir sur la manière d'écrire à sa sortie standard. Ensuite, la partie python est juste une complexité inutile (et probablement mal quandtue, vous jetant tout après le premier . plutôt que le dernier). Ensuite, vous avez besoin d'un $ avant le nom de la variable dans la syntaxe Bash. Je pense que le script suivant fait ce que vous voulez: xxx

( set -e au début rend la sortie shell immédiatement si une erreur survient, au lieu d'essayer d'exécuter pdflatex même si aucun fichier .tex a été produit ou somesuch.)


5 commentaires

Cela ne fonctionne pas, simplement parce que le script R qui ouvre la boîte de dialogue n'est pas exécuté. J'en ai besoin pour sélectionner le fichier


@ RAN2: Le script shell que j'ai écrit est invoqué oascript , mais le bit Appscript peut être faux car je ne connais pas AppleScript. Que voyez-vous si vous remplacez set -e par SET -ex (ceci provoque l'impression de la coque d'une trace d'exécution)?


Il dit: ++ oascript ./test2: ligne 7: Oascript: commande non trouvée + myfile =


@ RAN2: C'était une faute de frappe de ma part, fixée.


Thx no_ext = "$ {myfile%. *}" Aide vraiment. :) C'est ce que le python était pour :).



2
votes

Réalisez que les chemins App AppleScript sont du côlon ":" délimité. Vous avez besoin de slash délimité à Bash, donc dans des termes AppleScript qui est le "path Posix". En outre, lorsque vous utilisez Osascript, il ne peut pas ouvrir Windows de dialogue. Vous devez dire à une application d'ouvrir la fenêtre. Ensuite, vous "retournez" quelque chose de la pommette ... c'est ce qui va à Bash. Enfin, à bash pour exécuter une commande et attribuer le résultat à une utilisation variable `` autour de la commande. Donc, en sachant que voici un script shell pour utiliser un AppleScript pour obtenir la variable 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


1 commentaires

Cela fonctionne aussi pour moi depuis que j'avais contourner le problème Sakra mentionné (voir commentaire)



8
votes

Les problèmes suivants existent dans votre script:

Une variable définie dans la section AppleScript est définie dans le script de shell joint. Vous devez effectuer l'échange de données avec le script shell à l'aide de la substitution de commande. P>

AppleScripts invoqués à partir d'un script shell ne sont pas autorisés à faire une interaction de l'utilisateur car ils n'ont pas de contexte d'application. Vous pouvez utiliser l'application Helper "AppleScript Runner" pour exécuter des commandes d'interaction utilisateur. P>

Voici une version révisée de votre script où ces problèmes sont corrigés: P>

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


7 commentaires

+1 pour le raisonnement. Bien que je sois déjà piraté autour de cela, en utilisant: mkdir -p foo.app/contents/macos mv foo.sh foo.app/contents/macos/foo chmod + x foo.app/contents/macos/foo


accepté celui-ci parce que c'était le plus proche de ce que j'ai utilisé à la fin


$? -eq 0 est la clause de test Bash. Il teste si l'état de sortie renvoyé par la commande OSASScript est 0. Si l'utilisateur annule la boîte de dialogue Sélection de fichier, vous obtiendrez un statut non nul.


Puis-je envelopper cela dans une clause IF comme si [$ 1 = ''] utilise ce que vous avez dit d'autre utilisez le 1 $ comme nom de fichier?


Utilisez si [-Z "$ myfile"] pour tester si $ myfile détient une chaîne vide. Voir Topherdotcom.com/scribble/bash/bash-Test-opérateurs


Notez que cette réponse n'est plus strictement correcte. OS X Mavericks, Yosemite, El Capitan et Futures Versions (SO, 10.9 et Forward) ont supprimé le programme AppleScript Runner HELPER. Vous pouvez toujours piggerback un autre programme tel que Finder pour exécuter des chiffres de l'interface utilisateur, cependant.


Très intelligent!!! J'ai eu une exigence légèrement différente, mais j'ai adapté le script de Sakra, et cela a fonctionné brillamment pour moi. Voici le résultat.