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
3 Réponses :
Tout d'abord, vous devez obtenir le contenu de la variable code> myfile code> 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 (. Code> plutôt que le dernier). Ensuite, vous avez besoin d'un
$ code> avant le nom de la variable dans la syntaxe Bash. Je pense que le script suivant fait ce que vous voulez:
set -e code> au début rend la sortie shell immédiatement si une erreur survient, au lieu d'essayer d'exécuter
pdflatex code> même si aucun fichier
.tex code> a été produit ou somesuch.) p> p>
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 code>, mais le bit Appscript peut être faux car je ne connais pas AppleScript. Que voyez-vous si vous remplacez
set -e code> par
SET -ex code> (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 :).
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
Cela fonctionne aussi pour moi depuis que j'avais contourner le problème Sakra mentionné (voir commentaire)
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
+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 CODE> AppleScript Runner CODE> HELPER. Vous pouvez toujours piggerback un autre programme tel que Finder code> 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.
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.