# Automator lance un script shell dans terminal



## radar (2 Janvier 2011)

Bonjour (et meilleurs voeux pour cette année 2011),

j'ai un script qui renomme les sous-titres que je télécharge avec le même nom que le fichier vidéo auquel il est associé. Cependant, mon script n'est pas parfait et demande parfois de l'aide via ligne de commande. J'aimerais bien qu'à l'arrivée d'un fichier téléchargé à partir d'un certain site, Automator ouvre une fenêtre Terminal dans laquelle il fait tourner un script dont l'argument est le fichier en question.
Pour le lancement d'Automator en fonction de la provenance du fichier, je sais faire (dans les infos des fichiers téléchargés, on peut accéder au site de provenance), mais je n'arrive pas à ouvrir une fenêtre Terminal qui exécute mon mon script avec le fichier en question comme argument.
Une idée ?

Merci d'avance.


----------



## Anonyme (2 Janvier 2011)

Bonsoir,

L'action "*Exécuter un script Shell*" permet de faire cela sans ouvrir le Terminal.

Mets ce code dans l'action "Exécuter un script Shell".

```
for f in "$@"
do
	"~/Mon_script.sh" "$f"
done
```
Modifie le chemin *~/Mon_script.sh* par celui de ton script

Sélectionne "*/bin/bash*" et "*comme arguments*" dans les popup de l'action.

C'est tout.


----------



## radar (3 Janvier 2011)

Merci pour ta réponse.
Mais je cherche justement à ce qu'une fenêtre de Terminal soit ouverte.


----------



## Anonyme (3 Janvier 2011)

radar a dit:


> Merci pour ta réponse.
> Mais je cherche justement à ce qu'une fenêtre de Terminal soit ouverte.


OK, c'est l'action "*Exécuter un script AppleScript*" qui sera utilisée.
Mets ce code dans l'action :

```
on run {input, parameters}
	set script_path to quoted form of "/Users/jack/Desktop/suprime Accents.pl" -- à remplacer par le chemin de ton script Shell
	
	repeat with i in input
		if class of i is alias then set i to i as Unicode text
		if i does not start with "/" then set i to POSIX path of i
		tell application "Terminal"
			activate
			do script script_path & " " & quoted form of i
		end tell
	end repeat
	return input
end run
```


----------



## radar (3 Janvier 2011)

Je teste ça ce soir et te tiens au courant.
Merci encore.


----------



## radar (3 Janvier 2011)

Bon, ce script fait exactement ce que j'ai demandé. Mais, puisqu'il doit toujours y en avoir un (mais), je me suis trompé dans ma demande 
Ce que j'aimerais faire est :
À l'arrivée d'un fichier .zip dans mon répertoire de téléchargements, un script perl se lance. Il va juste vérifier la source du fichier. S'il provient d'un site de sous-titres (sous-titres.eu, opensubtitles, etc), il ouvre un terminal dans lequel il exécute un autre script perl.
Pourquoi deux scripts ? Tout simplement pour ne pas lancer la fenêtre de terminal si la source du fichier ne m'intéresse pas. L'idéal aurait été d'utiliser les dossiers intelligents avec Automator, mais ce n'est pas possible.
Après, si quelqu'un connaît un moyen d'ouvrir une fenêtre de terminal à partir d'une commande shell, je suis preneur.


----------



## Anonyme (4 Janvier 2011)

radar a dit:


> Ce que j'aimerais faire est :
> À l'arrivée d'un fichier .zip dans mon répertoire de téléchargements, un script perl se lance. Il va juste vérifier la source du fichier. S'il provient d'un site de sous-titres (sous-titres.eu, opensubtitles, etc), il ouvre un terminal dans lequel il exécute un autre script perl.



Voici la solution pour  lancer un script dans le terminal à partir d'un script perl :

*1-* Utilise la solution du *message#2* pour exécuter ton premier  script *perl*.

*2-* Voici le code à ajouter dans ton script perl, il ouvre une fenêtre du Terminal, lance l'autre script perl avec comme paramètre le chemin du fichier

```
if ( blabla) {
    system("/usr/bin/osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script  quoted form of \"/Users/jack/Desktop/mon Script.pl\" & space & quoted form of \"$chemin\"' -e 'end tell'");
}
```
*$chemin* est une variable *perl* qui contient le chemin du fichier.
remplace */Users/jack/Desktop/mon Script.pl* par le chemin de ton deuxième script perl


----------



## radar (4 Janvier 2011)

Merci beaucoup. J'avais trouvé une solution équivalente en créant un premier script Perl qui appelle un AppleScript qui lance un Terminal dans lequel il exécute le second script Perl. Ta solution est plus élégante, elle me permet de réduire le nombre de fichiers. Merci beaucoup.
Deux autres questions :

Sais-tu comment faire pour que la fenêtre de Terminal se ferme à la fin de l'exécution du script ? Que ce soit une commande dans mon script Perl lui-même ou dans l'AppleScript.
Mes actions de dossier sur le répertoire de téléchargements sont un peu bizarres. Lorsque c'est activé, ça fait clignoter l'écran à chaque fois qu'un nouvel élément y est mis. En plus, l'action de dossier se comporte normalement si un seul fichier est téléchargé. Si plusieurs le sont à intervalle court, seuls quelques uns sont traités. Comme si le temps de traitement du premier fichier masque l'arrivée des autres.

Merci encore pour toute l'aide que tu m'as apportée.


----------



## Anonyme (4 Janvier 2011)

Bonjour,



radar a dit:


> Sais-tu comment faire pour que la fenêtre de Terminal se ferme à la fin de l'exécution du script ? Que ce soit une commande dans mon script Perl lui-même ou dans l'AppleScript.


 Le plus simple est de sélectionner &#8220;*fermer si le shell s&#8217;est arrêté correctement*&#8221; lorsque que le shell quitte : dans les préférences du Terminal --> onglets "*Réglages*" --> onglets "*Shell*".
Et de mettre *;exit* à la fin du do script, comme ceci

```
if ( blabla) {
    system("/usr/bin/osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script  (quoted form of \"/Users/jack/Desktop/mon Script.pl\") & space & (quoted form of \"$chemin\") & \";exit\"' -e 'end tell'");
}
```

La modification de cette préférence ne fermera pas la fenêtre si l'utilisateur tape ou exécute une commande ou par une commande AppleScript sans le *;exit*



--


radar a dit:


> Mes actions de dossier sur le répertoire de téléchargements sont un peu bizarres. Lorsque c'est activé, ça fait clignoter l'écran à chaque fois qu'un nouvel élément y est mis. En plus, l'action de dossier se comporte normalement si un seul fichier est téléchargé. Si plusieurs le sont à intervalle court, seuls quelques uns sont traités. Comme si le temps de traitement du premier fichier masque l'arrivée des autres.


Oui, c'est un problème, pour le diminuer ajuste le temps de l'intervalle des actions de dossier (Léopard ou plus récent)
Voici un script AppleScript qui ajuste l'intervalle (à ne faire qu'une seule fois sur la machine)

```
tell application "/System/Library/CoreServices/Folder Actions Dispatcher.app" to set polling interval to 1
```


Une autre solution est de vérifier le contenu du dossier par exemple les fichiers *zip*.
ceci fonctionne si les *zip* sont déplacés dans un autre dossier ou supprimés  au début du traitement.

Automator (pour les actions de dossier) enregistre un script AppleScript  dans le dossier "*/Bibliothèque/Scripts/Folder Action Scripts*" dans ta maison, voici un exemple de code à ajouter au début de ce script.

```
on adding folder items to this_folder after receiving added_items
	try
		tell application "Finder" to set tfiles to (document files whose name extension is "zip") as alias list
		if tfiles is not {} then set added_items to added_items & tfiles
	end try
```


----------



## radar (4 Janvier 2011)

Mac_Jac a dit:


> Bonjour,
> 
> 
> Le plus simple est de sélectionner *fermer si le shell sest arrêté correctement* lorsque que le shell quitte : dans les préférences du Terminal --> onglets "*Réglages*" --> onglets "*Shell*".
> ...


OK. Merci. J'y ai pensé et j'aurais dû tester. Je pensais qu'elle fermerait aussi la fenêtre à chaque commande qui se termine correctement.



Mac_Jac a dit:


> Oui, c'est un problème, pour le diminuer ajuste le temps de l'intervalle des actions de dossier (Léopard ou plus récent)
> Voici un script AppleScript qui ajuste l'intervalle (à ne faire qu'une seule fois sur la machine)
> 
> ```
> ...


Si je comprends bien, je suis obligé de faire une action de dossier sur le répertoire contenant les .zip. Le problème revient un peu au même : si je télécharge plusieurs zip, seulement le premier sera mis dans le répertoire. À moins que je n'aie pas vraiment compris ton intention.

---------- Nouveau message ajouté à 20h25 ---------- Le message précédent a été envoyé à 20h07 ----------

Ça marche parfaitement, modulo les aléas des action folder.
Merci beaucoup.


----------



## Anonyme (4 Janvier 2011)

J'ai oublié de spécifier le dossier (this_folder ) dans le code AppleScript de l'action de dossier.

C'est  
	
	



```
tell application "Finder" to set tfiles to (document files of  this_folder  whose name extension is "zip") as alias list
```
Sinon,  le dossier par défaut sera le *Bureau*


----------



## Anonyme (5 Janvier 2011)

Un autre oubli, pour ne pas avoir de doublons avec les éléments ajoutés.

Voici le script corrigé 

```
on adding folder items to this_folder after receiving added_items
	try
		tell application "Finder" to set tfiles to document files of this_folder whose name extension is "zip"
		repeat with i in tfiles
			set t_zip to i as alias
			if t_zip is not in added_items then set end of added_items to t_zip
		end repeat
	end try
```


----------



## radar (5 Janvier 2011)

Merci.


----------

