2010-01-24 6 views
1

Cela me rend fou. J'essaie de lire un fichier dans bash, supprimer les doublons, trier, puis afficher une fenêtre "choix de la liste" via applescript.Sortie de Bash sous forme de liste de problèmes Applescript

Mon fichier $ DATALOG est formaté comme ceci:

field1 field2

field1 field3

field1 field4

etc ...

AppleScript = awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//'

Maintenant, cette ligne fonctionne très bien. dans $ Applescript, je reçois une sortie comme ceci:

"field 2","field 3", "field 4"

Ce qui est exactement ce que je veux.

Maintenant, je prends cette sortie, et j'ajoute le backslash avant les guillemets, et les parties de l'applescript.

Applescript=`echo "tell application \"System Events\" to return (choose from list {$Applescript})"| sed 's/\"/\\\"/g'` 

Et cela me fait exactement ce que je veux:

tell application \"System Events\" to return (choose from list {\"field 2\",\"field 3\",\"field 4\"})

Maintenant, j'essaie la commande osascript:

osascript -e $Applescript

Et je reçois une erreur:

4:4: syntax error: Expected expression but found end of script. (-2741)


Alors, j'ajouter des guillemets:

osascript -e "$Applescript"

Et je reçois une erreur:

17:18: syntax error: Expected expression, property or key form, etc. but found unknown token. (-2741)

Je ne peux pas dire ce qui se passe ici l'enfer, donc je décide de copier un écho de l'aéroport $ et essayez cela en tant que variable.

Airport= tell application \"System Events\" to return (choose from list {\"field 2\",\"field 3\",\"field 4\"})

ET QUI FONCTIONNE SANS AUCUNE MODIFICATION.

Alors ....

J'ai besoin de savoir comment faire cela sans avoir à mettre en permanence mes variables.

+0

J'ai oublié de mentionner que l'écriture d'un fichier temporaire fonctionne correctement. Je ne veux pas vraiment écrire des fichiers temporaires si ... D'une autre manière? –

Répondre

5

N'essayez pas de le rendre plus compliqué que nécessaire. Profitez de deux guillemets dans la chaîne du shell pour former un mot shell comme la valeur pour l'argument -e osascript:

Applescript=$(awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//') 
osascript -e 'tell application "System Events" to return (choose from list {'"$Applescript"'})' 

En outre, il est une bonne idée d'éviter l'utilisation de guillemets obliques pour faire une substitution de commande; le formulaire $(command) est préféré car il est beaucoup plus facile de construire des commandes correctes même lorsqu'il s'agit d'imbrications complexes.

+0

Merci - cela fonctionne parfaitement. Je suis toujours nouveau à bash donc ces petites choses aident un peu. –