J'utilise un macos em> idéalement, la commande serait Qu'est-ce qui serait une solution de contournement? P> P> Osascript Code> Commande forte>
dans un script shell et j'essaie d'exécuter la commande suivante: osascript -e app «Calendrier» ' code> comme exemple de solution de travail. Cependant, je ne peux pas sembler insérer une variable entre les marques de citation entre «'». P>
3 Réponses :
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\""
Croisez vos doigts que AppName code> 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" code> (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
; code> comme
bash code> utilise.)
apparemment pas , bien que la question est étiquetée bash code> et
zsh Code>, quelque chose comme
osascript -e $ 'sur Exécuter ARGV \ NQUIT App (élément 1 de ARGV) \ NEND RUN' TEXEDIT code> 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) code>. 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 😊
Essayez: ou, si osascript code> nécessite des citations doubles supplémentaires, essayez: p>
Pour une raison quelconque, ce dernier exemple est plus facile de rester directement dans ma tête que le barreaux de renvoi \ " code> é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 code> ne contient pas de guillemets doubles.
@cheppner, re "fragile" i>: merci, je ne suis pas sur macos i> 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" i> avertit contre. Cela fonctionne f = '"dquote"'; echo "$ f" code>, 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' code>. Alors
Osascript code> verra l'argument
quitter l'application bizarre" Appname code>, qui contient une double citation non décontractée. Vous devriez vous assurer que
appname code> contenait un fragment de AppleScript que représente i> le nom de l'application lorsqu'il est incorporé dans le contexte environnant, plutôt que simplement le nom de l'application.
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
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" Code>, 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" code>.
@ 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 B> - voir Cheppner's's i> commenter et Suivi de OP . Il s'agit d'une question spécifique de pomme raffinée, pas b> 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 "'"' code>. 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." I>: Veuillez inclure le texte complet des messages d'erreur dans la question. Ne dites pas simplement "Cela ne fonctionne pas" i> - Soyez précis.