0
votes

Insérez une variable entre-deux '' dans une commande shell osascript?

J'utilise un macos Osascript Commande dans un script shell et j'essaie d'exécuter la commande suivante: xxx

idéalement, la commande serait osascript -e app «Calendrier» ' comme exemple de solution de travail. Cependant, je ne peux pas sembler insérer une variable entre les marques de citation entre «'».

Qu'est-ce qui serait une solution de contournement?


6 commentaires

Voir Gestion des processus pour comment faire ce genre de chose correctement.


@Daniilgannota: Pourquoi utilisez-vous des guillemets simples lorsque vous ne voulez pas que l'interpolation se produise? Mis à part la solution évidente Osascript -e "Quitt App $ AppName" , une alternative facile à lire, ce qui pourrait être pratique si vous souhaitez faire un jour un mélange de chaînes interpolées et non interpolées , est Osascript -e 'Quit App' '"$ AppName" .


@ user1934428 J'ai essayé ces deux mais ils me jettent une erreur! Je reçois des erreurs -2740, -2741 et -2743. C'est pourquoi je demande ici :) Apparemment, cette méthode a fonctionné pour moi: Osascript -e 'ON Run Argv' -E 'Quit' Quit '(élément 1 de ARGV)' -E 'Entrée de fin' "$ AppName" < / code>


Closers: Pas un duplicatin - voir Cheppner's's commenter et Suivi de OP . Il s'agit d'une question spécifique de pomme raffinée, pas une question * Nix ..


@Daniilgannota: Si vous voulez passer littéralement des citations doubles à Osascript (ce qui serait une exigence étrange, mais pas inconcevable), vous avez bien sûr de les inclure dans la commande: Osascript -e 'Quit app "' '" $ AppName "'"' . Je viens de montrer le principe général de la manière de gérer la citation. Vous devez appliquer cela dans la manière dont il convient à votre cas d'utilisation du béton.


@Daniilgannota, re "Je reçois des erreurs -2740, -2741 et -2743." : Veuillez inclure le texte complet des messages d'erreur dans la question. Ne dites pas simplement "Cela ne fonctionne pas" - Soyez précis.


3 Réponses :


1
votes

Le point (un des points, de toute façon) de guillemets simples est d'empêcher une interpolation variable. Cela ressemble à ce que vous voulez vraiment, c'est un moyen d'obtenir des citations doubles dans une chaîne. Il y a beaucoup de façons de faire ça. Un commun est:

osascript -e "quit app \"$appname\""


4 commentaires

Croisez vos doigts que AppName ne contient pas de double citation :) La version sécurisée est quelque chose comme Osascript -e 'ON Run Argv' -E 'Quit' Quit (élément 1 de Argv) '' -e 'Entrée d'exécution' "$ AppName" (il peut y avoir un moyen légèrement plus court pour spécifier un script multiligne; je ne sais pas s'il y a un équivalent AppleScript pour ; comme bash utilise.)


apparemment pas , bien que la question est étiquetée bash et zsh , quelque chose comme osascript -e $ 'sur Exécuter ARGV \ NQUIT App (élément 1 de ARGV) \ NEND RUN' TEXEDIT est une option. (Morale de l'histoire: n'utilisez pas de "doublures" paramétrées dans AppleScript.)


Je reçois l'erreur suivante lorsque j'essaie de l'exécuter Erreur de syntaxe: un identifiant ne peut pas aller après ce numéro. (-2740) . Est-ce que tu sais pourquoi?


@cheppner Comme je suis très inexpérimenté avec des commandes Shell, je ne suis pas tout à fait sûr de ce que vous avez fait là-bas, mais cela a fonctionné! Merci beaucoup 😊



-1
votes

Essayez: xxx

ou, si osascript nécessite des citations doubles supplémentaires, essayez: xxx


6 commentaires

Pour une raison quelconque, ce dernier exemple est plus facile de rester directement dans ma tête que le barreaux de renvoi \ " équivalent - tout en l'écrivant de toute façon. Lisez-le plus tard sur celui-ci semble également obscur.


C'est toujours fragile: votre seconde suppose que $ AppName ne contient pas de guillemets doubles.


@cheppner, re "fragile" : merci, je ne suis pas sur macos citant, donc je vais probablement supprimer cette réponse bientôt.


Ce n'est pas unique à MacOS; Vous avez le même problème sur n'importe quelle plate-forme. Le problème plus important ici est que vous imbriquez un script à l'intérieur d'un autre script, qui ne fait que multiplier les préoccupations de citation.


@cheppner, dans ce cas, on ne sait pas ce que "Votre deuxième suppose ... Double citations" avertit contre. Cela fonctionne f = '"dquote"'; echo "$ f" , donc si utilisé soigneusement ce qui est fragile là-bas? (Convenu toutefois, que la minimisation de la citation est préférable.)


Dites appName = 'weird "appName' . Alors Osascript verra l'argument quitter l'application bizarre" Appname , qui contient une double citation non décontractée. Vous devriez vous assurer que appname contenait un fragment de AppleScript que représente le nom de l'application lorsqu'il est incorporé dans le contexte environnant, plutôt que simplement le nom de l'application.



2
votes

essayer de construire un script de manière dynamique à l'aide de la chaîne d'interpolation est toujours fragile. Vous devez transmettre le nom de l'application sous la forme d'un argument em> à l'AppleScript, de sorte que vous n'avez pas à vous soucier de s'échapper de caractères à travers deux niveaux d'interprètes.

APPNAME=$1  # The name should be passed as a single argument.

if pgrep -x "$APPNAME" > /dev/null # checking if app is open
then
  echo "Closing..."
  osascript -e 'on run argv' -e 'quit app (item 1 of argv)' -e 'end run' "$APPNAME"

else
  echo "*** The app is not open"
fi


0 commentaires