Automator bash script LC_ALL="C"

Bonjour,


Lorsque j'écris un script Automator pour exécuter un script bash, les variables d'environnement de "locale" ne sont pas positionnées à la valeur courante du système, mais par défaut à "C".


Exemple de script Automator :


- Exécuter un script shell

- shell: /bin/bash

- contenu du script :

locale


Réponse à l'exécution :


(

"LANG=",

"LC_COLLATE="C"",

"LC_CTYPE="C"",

"LC_MESSAGES="C"",

"LC_MONETARY="C"",

"LC_NUMERIC="C"",

"LC_TIME="C"",

"LC_ALL="

)


alors que mon système est bien configuré par défaut comme étant de locale LANG=fr_FR.UTF8 et que celles-ci sont correctement positionnées lorsque je lance une console.


Comment puis-je, dans mon script Automator, récupérer les valeurs définies par défaut sur le système sans avoir à les forcer de manière arbitraire ?


Merci d'avance.

MacBook Pro with Retina display, OS X El Capitan (10.11.6)

Publiée le 10 déc. 2018 à 05h17

Répondre
Question marquée comme Réponse la mieux classée

Publiée le 10 déc. 2018 à 13h16

J'ai enfin résolu mon problème.


Voici la solution :


Dans Automator, je commence par un shell applescript :


on run argv

set fileName to ""

set locale to user locale of (get system info) & ".UTF-8"

set fileAlias to item 1 of argv as string

if fileAlias is not equal to "" then

set fileName to POSIX path of fileAlias

end if

return locale & "\n" & fileName

end run


Et ensuite un script bash :


IFS="\n" read -r -a array <<< "$@"

locale="${array[0]}"

export LANG=$locale

filename="${array[1]}"

nohup /usr/local/bin/mon_programme $filename >/dev/null 2>&1 &


Et tout fonctionne nickel.


J'utilise comme séparateur le caractère "\n" qui ne peut faire partie ni de la locale ni

d'un nom de fichier. Je découpe ensuite la réponse de l'applescript avec ce séparateur

et récupère ainsi la locale et l'éventuel nom de fichier. J'exécute alors le programme

'/usr/local/bin/mon_programme' avec une syntaxe bizarre ('nohup' + le '&' final) qui permet

de détacher le processus du lanceur Automator qui se termine alors normalement, le

processus du programme tournant alors en tâche de fond.


L'idéal eût été de pouvoir retourner plusieurs argument depuis l'applescript pour les

fournir proprement par $@ au shell, mais je ne sais pas faire (ni ne sais si c'est possible).


On pourrait de la même manière récupérer 'autres infos système (comme le répertoire

utilisateur, par exemple) pour compléter l'initialisation du shell.


C'est un moyen peu cher de simuler une appli OS X depuis un programme ligne de

commande non packagé pour OS X sans avoir à passer par une console et taper du

texte et on peut de plus lier des types de fichiers à cette appli qui est alors ouverte

automatiquement dès que ceux-ci sont double-cliqués dans le Finder. On ne peut

cependant mourir qu'un seul fichier depuis le Finder (mais ça pourrait être résolu

simplement en concaténant les noms de fichier dans une boucle de l'applescript).


En espérant que ça puisse aider quelqu'un un jour, merci à tous ceux qui m'on répondu,

ça m'a bien soutenu.

14 réponses
Question marquée comme Réponse la mieux classée

Le 10 déc. 2018 à 13h16 en réponse à fdesar

J'ai enfin résolu mon problème.


Voici la solution :


Dans Automator, je commence par un shell applescript :


on run argv

set fileName to ""

set locale to user locale of (get system info) & ".UTF-8"

set fileAlias to item 1 of argv as string

if fileAlias is not equal to "" then

set fileName to POSIX path of fileAlias

end if

return locale & "\n" & fileName

end run


Et ensuite un script bash :


IFS="\n" read -r -a array <<< "$@"

locale="${array[0]}"

export LANG=$locale

filename="${array[1]}"

nohup /usr/local/bin/mon_programme $filename >/dev/null 2>&1 &


Et tout fonctionne nickel.


J'utilise comme séparateur le caractère "\n" qui ne peut faire partie ni de la locale ni

d'un nom de fichier. Je découpe ensuite la réponse de l'applescript avec ce séparateur

et récupère ainsi la locale et l'éventuel nom de fichier. J'exécute alors le programme

'/usr/local/bin/mon_programme' avec une syntaxe bizarre ('nohup' + le '&' final) qui permet

de détacher le processus du lanceur Automator qui se termine alors normalement, le

processus du programme tournant alors en tâche de fond.


L'idéal eût été de pouvoir retourner plusieurs argument depuis l'applescript pour les

fournir proprement par $@ au shell, mais je ne sais pas faire (ni ne sais si c'est possible).


On pourrait de la même manière récupérer 'autres infos système (comme le répertoire

utilisateur, par exemple) pour compléter l'initialisation du shell.


C'est un moyen peu cher de simuler une appli OS X depuis un programme ligne de

commande non packagé pour OS X sans avoir à passer par une console et taper du

texte et on peut de plus lier des types de fichiers à cette appli qui est alors ouverte

automatiquement dès que ceux-ci sont double-cliqués dans le Finder. On ne peut

cependant mourir qu'un seul fichier depuis le Finder (mais ça pourrait être résolu

simplement en concaténant les noms de fichier dans une boucle de l'applescript).


En espérant que ça puisse aider quelqu'un un jour, merci à tous ceux qui m'on répondu,

ça m'a bien soutenu.

Le 10 déc. 2018 à 12h18 en réponse à Fontom

Merci pour le lien, mais j'ai déjà réalisé des services via Automator et je n'ai pas eu de problème particulier.

Là, je crée une application et la question est quelque peu différente...


J'ai bien avancé sur votre idée d'ajouter un front-end applescript, et tout semble marcher correctement, sauf que...

lorsque Automator lance une couche applescript, celle-ci affiche de façon autoritaire une fenêtre d'erreur absconse lorsqu'aucun fichier ne lui est fourni, alors que le cas est parfaitement géré dans le code et qu'elle fonctionne par ailleurs très bien et lance parfaitement mon appli via le shell bash. Encore un autre "bug" d'Automator, je crains bien...


Grrr !

Le 10 déc. 2018 à 10h27 en réponse à micheldevoutezac

Merci pour les réponse. Un conseil de votre ami connaissant applescript serait peut-être le bienvenu :


Je suis parti vers la solution (quand même un peu bancale) de Fontom : écrire un applescript par dessus le shell.


Mais c'est un véritable enfer, car s'il est assez facile de récupérer la locale en applescript, mon script bash attend *éventuellement* aussi un nom de fichier dans $@... hors je ne connais pas du tout applescript et je ne sais pas comment retourner deux valeurs pour l'argv de mon script (ie : locale nom_de_fichier) :-(


Pour le moment, j'en suis à retourner la concaténation des deux avec le script suivant :


on run argv

set locale to user locale of (get system info) & ".UTF-8"

set fileAlias to item 1 of argv as string

set fileName to POSIX path of fileAlias

return locale & "•" & fileName

end run


puis à découper en bash l'argument passé avec le séparateur '•'. Mais ce n'est pas vraiment satisfaisant (c'est même franchement horrible)...


D'autant que je ne sais pas encore comment réagira l'applescript lorsqu'il sera appelé sans nom de fichier (pour tester dans Automator, j'ai mis un appel au Finder encore au dessus) en entrée : je pense qu'il faudra que je traite ce cas explicitement et je n'ai pas vraiment envie d'apprendre à programmer en Applescript.


Si seulement on avait eu un utilitaire pour pouvoir récupérer la locale système de l'utilisateur (et autres informations du système !) directement depuis la ligne de commande...


Bref, beaucoup de tracas pour un problème bien stupide !


Encore merci.

Le 10 déc. 2018 à 07h59 en réponse à fdesar

Bonjour,


Je fais le même constat que vous...

Si je tape la commande

do shell script "locale"

dans un script AppleScript

je récupère le même résultat que vous.

Je viens de poser la question à un ami dont les compétences en AppleScript sont nettement plus étendues que les miennes et dès que j'ai une réponse, je vous en fais part.

Cdlt

Le 10 déc. 2018 à 11h47 en réponse à micheldevoutezac

Quelques explications...


J'ai un programme classique (pas une appli packagée OS X) dans /usr/local/bin que je veux pouvoir appeler comme une application standard, c'est à dire pouvoir la lancer depuis la toolbar et pouvoir la lier à un certains type de fichiers qui la lanceront automatiquement.


Pour ce faire, j'ai écrit un script Automator qui lance un script bash, qui lui lance l'appli et que j'ai mi dans le répertoire /Application. Lorsque je "click" sur un fichier du type lié, le Finder appelle alors le script qui lance l'application avec le nom de fichier comme argument : c'est bien pratique. Tout comme j'ai mis le lanceur dans ma toolbar et modifié son icône, ce qui me permet de lancer rapidement l'application sans passer par une console et elle ne reçoit alors pas de nom de fichier à ouvrir.


J'ai un peu triché pour rendre la main et faire que l'appli se détache du script pour pouvoir la lancer plusieurs fois si nécessaire, mais c'est un simple détail (j'utilise nohup : ça marche très bien mais l'inconvénient est que l'app n'est pas considérée active par le Finder, mais tant pis, c'est bien pratique, 'ps ax' est mon ami 🙂).


C'est en gros, une méthode du pauvre pour faire d'un simple programme ligne de commande, pas encore packagé pour OS X, une pseudo-application compatible avec le Finder.


Tout allait très bien jusqu'à ce que je me lance dans un développement autour de cette application qui requiert une localisation (GNU gettext). Et c'est là que j'ai réalisé que l'environnement linguistique du programme lancé par Automator n'était pas correct : si je lance le prog par la ligne de commande, mes traductions fonctionnent correctement, si je le lance par mon raccourci, il n'y a pas de traduction. Ça m'a bêtement fait perdre pas mal de temps et j'essaye de solutionner temporairement le problème en attendant que ce programme soit officiellement packagé pour OS X, ce que je n'ai ni le temps ni l'envie de faire moi même.


Si vous avez une meilleur idée, je suis preneur 🙂

Cette discussion a été fermée par le système ou l’équipe de la communauté. Vous pouvez voter pour les publications que vous jugez utiles ou effectuer des recherches dans la communauté pour trouver des réponses supplémentaires.

Automator bash script LC_ALL="C"

Bienvenue dans la Communauté d’assistance Apple
Un forum où les clients Apple s’entraident avec leurs produits. Faites vos premiers pas avec votre compte Apple.