J'essaie de configurer quelques raccourcis clavier qui ouvrent des sessions iTerm spécifiques, ce que j'ai pu faire avec BetterTouchTool et un peu de magie AppleScript. Le problème est qu'OS X insiste pour ouvrir une fenêtre de terminal pour tout script shell que vous exécutez via l'interface graphique (c'est-à-dire à partir du Finder ou comme raccourci clavier de BetterTouchTool). La fenêtre du terminal n'apparaît pas si j'exécute le script directement à partir d'un autre terminal.
Une solution de contournement que j'ai trouvée consistait à envelopper le script dans un répertoire .app, ce qui résout le problème de la fenêtre de terminal superflue, mais a d'autres problèmes (par exemple, OS X semble traiter chaque fenêtre iTerm résultante comme une application distincte, encombrant mon dock ). (EDIT: ce comportement a été causé par un bug dans mon script, voir ci-dessous)
J'ai également essayé d'attribuer l'application Terminal à un autre bureau virtuel dans les paramètres des espaces pour tenter de la déplacer hors de vue, mais elle passera d'abord sur ce bureau avant d'exécuter le script.
Existe-t-il un moyen de désactiver complètement ce comportement? J'ai déjà trouvé le paramètre dans les préférences du terminal pour fermer la fenêtre une fois le script terminé, mais c'est toujours ennuyeux de voir la fenêtre du terminal s'afficher pendant une seconde.
la source
Réponses:
Ouvrez Automator , choisissez Application , ajoutez une action Exécuter le script Shell et placez votre commande Shell entre guillemets (si vous avez un fichier, vous pouvez simplement le faire glisser et le déposer).
Outre la lecture, vous pouvez maintenant l' enregistrer (en tant qu'application n'importe où) et même définir l'icône .
la source
&
, puis appeler un AppleScript pour amener l'application (dans mon casmplayer
) au premier plan:mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
mplayer
pour lire une vidéo à partir d'un diaporama (dans Skim). Il y a un bug que le joueur reste en arrière-plan si Skim est réglé sur plein écran, je ne suis pas sûr cependant, si ce bug est uniquement lié à Skim ou à toutes les applications en plein écran, j'ai donc pensé publier ma solution ici.Voici un exemple rapide et sale avec presque aucun effort (pour une application nommée "myapp"):
Faites une hiérarchie partielle des applications:
Assurez-vous que la première ligne de votre script a le chemin d'accès complet au programme requis, par exemple,
Nommez votre script shell "myapp" (sans guillemets, sans extension), donnez-lui des autorisations d'exécution, puis placez-le dans le sous-répertoire MacOS. Pour lui donner des autorisations d'exécution:
Accédez au sous-répertoire Contents et créez un fichier PkgInfo contenant la chaîne: APPL ???? [pas de terminaison de ligne à la fin de la chaîne!] Utilisez l'utilitaire cat (1) pour créer le fichier:
Après avoir tapé la chaîne (n'appuyez pas sur la touche retour!), Entrez deux contrôles-D, qui fermeront
le fichier sans terminateur de ligne et vous renverront à l'invite du shell.)
Double-cliquez sur votre nouvelle "application" dans le Finder. Il fonctionnera sans fenêtre.
la source
Vous voudrez peut-être consulter Platypus , qui crée des applications Mac OS X à partir de scripts shell et d'autres scripts interprétés.
la source
Voici une petite solution de contournement, au cas où vous auriez envie de lanceurs d'applications comme Alfred . Je l'utilise tous les jours et j'ai acheté le Powerpack , qui vous permet d'exécuter des scripts shell silencieux.
Ceux-ci n'ouvriront pas de terminal lors de l'exécution et peuvent être liés à n'importe quelle séquence de mots clés. Ils peuvent même inclure des paramètres et avoir des options supplémentaires:
J'utilise cela pour quelques petits extraits, et c'est très flexible.
la source
Si vous ajoutez une clé
LSUIElement
et la définissez sur1
dansInfo.plist
votre application, elle ne créera pas d'icône dans le Dock.Voici
Info.plist
ma petite application de script shell:la source
touch
le bundle pour m'assurer que la dernière version était utilisée. Mais de toute façon, je n'aime pas vraiment l'approche groupée car il semble qu'elle créera toujours des instances d'application distinctesdo shell script "say 'arsti'"
, cela n'ouvrira pas la fenêtre du terminal.pgrep
, puis passe le code pertinent directement àosascript
(l'interpréteur AppleScript). Le problèmepgrep
vient de Homebrew et n'est pas par défaut$PATH
. Mon script a donc toujours lancé une nouvelle instance iTerm, même si elle était déjà en cours d'exécution. Après avoir ajouté le chemin completpgrep
dans le script, l'approche du bundle semble bien fonctionner après tout, donc je pense que je suis content pour l'instant ;-)CFBundleExecutable
etCFBundleIconFile
), j'ai réussi à ce que cela fonctionne parfaitement.Voici un petit contournement:
Compilez un applescript qui appelle un script shell :)
Le
osacompile
compilera l''do shell script "XXX"'
extrait de code Apple. Votre script shell est le XXX.Méfiez-vous des citations, le script shell doit être cité correctement pour dépasser le shell que vous utilisez pour le compiler toujours intact.
Mais cela peut être exécuté à partir de BetterTouchTool sans aucune folie.
la source
Il existe un autre entraînement possible. Protégez votre script shell dans un workflow d'automatisme. Appelez le workflow avec launchd. Le code est:
Cela ne lancera aucun programme ni n'apparaîtra dans la barre de menu et son chemin sera plus silencieux qu'une application Platypus.
Une manière encore meilleure d'exécuter des scripts shell est directe dans launchd.
exécutera la commande ultra silencieusement en arrière-plan.
la source