# applescript et démarrage automatique



## dLeu (30 Juin 2006)

Bonsoir,

Je place un script parfaitement fonctionnel et enregistré en tant qu'application dans la liste des applications à lancer au démarrage de la session. 

Ce script ne contient qu'une ligne : 
	
	



```
do shell script "/usr/sbin/disktool -p disk1s1 0 > /dev/null"
```
 Ce script fonctionne parfaitement.

Au démarrage : il est censé s'exécuter automatiquement.  Pourtant j'ai une fenêtre qui me demande si je veux exécuter ce script avec deux boutons : quit et run.  

Le fait que cette fenêtre apparaît peut-il être expliquer par le fait que le disque qu'il est censé démonter  n'apparaît que tardivement sur le bureau ?  Y a-t-il une autre raison ? Et si c'est le cas, comment faire en sorte que le script ne s'exécute qu'après le montage des disques (ici des disques firewire) ?

Didier


----------



## zacromatafalgar (1 Juillet 2006)

Salut,

D&#233;coche la case "Ecran de d&#233;marrage" &#224; l'enregistrement...


----------



## ntx (1 Juillet 2006)

Solution de facilité : tu ajoutes un sleep devant ta commande UNIX.

Solution plus "smart" : tu boucles tant que "diskutil list | grep <le nom de ton volume>" ne renvoie pas 0. Met un nombre maximum d'essais et une tempo entre les essais pour ne pas boucler indéfiniment.

PS : disktool est "deprecated", utilise diskutil à la place.


----------



## dLeu (1 Juillet 2006)

Super vos réponses.  Je vais voir tout cela et je reposte en cas de problème.  

Didier


----------



## dLeu (1 Juillet 2006)

J'ai encore un problème : 

En utilisant la commande shell disktool tout marche à merveille.  Mais comme l'a souligné ntx, elle est deprecated et je tente d'utiliser diskutil à la place :

```
do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
```
 ou

```
do shell script "/usr/sbin/diskutil unmount /dev/disk1s1 > /dev/null"
```
 mais dans les deux cas, il démonte bien le disque mais me met une boîte de dialogue avec :





> Volume failed to unmount - Edit -- Ok-


Je pense que c'est lié à un problème de timing : le script s'exécutant trop tôt. 

Comment faire pour mettre un délai : je n'arrive pas à mettre en place la boucle "diskutil list | grep Backup".

Un coup de main est le bienvenu.

Merci à vous.


----------



## dLeu (1 Juillet 2006)

J'ai fait ça :
	
	



```
repeat
    set test to boolean returned of (do shell script "diskutil list | grep /Volumes/Backup")
    if test then exit repeat
end repeat

do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
```
mais ça ne fonctionne pas : à l'exécution il m'affiche : "La commande sest arrêtée avec un état non nul." tout en surlignant la partie do shell script "diskutil list | grep /Volumes/Backup".

Où se trouve le problème ?


----------



## ntx (1 Juillet 2006)

Je n'y connais rien en Apple Script donc je ne dirais rien sur la syntaxe de ton script. Mais en général une commande shell renvoie 0 quand elle s'est exécutée normalement (à vérifier pour diskutil vu que la page man ne dit rien à ce sujet), donc il faudrait tester un entier et pas un booléen. De plus entre deux commandes "diskutil list", met en temporisation sinon il va boucler trop vite.


----------



## dLeu (2 Juillet 2006)

Merci ntx pour tes observations.  J'ai changé le type en integer et rajouté un délai mais j'ai toujours le même message.  Je tente de trouver des infos sur diskutil sur le net, mais il n'y a pas pléthore.


----------



## ntx (2 Juillet 2006)

J'ai essayé la commande dans le terminal. Tu as 0 si le grep trouve quelque chose et 1 s'il ne trouve rien.


----------



## dLeu (2 Juillet 2006)

Ah, merci pour l'info.

Mon code est devenu 
	
	



```
repeat
    set test to integer returned of (do shell script "diskutil list | grep /Volumes/Backup")
    if (test = 0) then exit repeat
    delay 1
end repeat

do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
```
 Mais j'ai toujours le même message que précédemment : "La commande sest arrêtée avec un état non nul." tout en surlignant la partie do shell script "diskutil list | grep /Volumes/Backup".

C'est donc dans mon code que se situe le problème.

Appel aux applescripters de tous poils ...


----------



## zacromatafalgar (3 Juillet 2006)

Essaye sans le "integer returned"

```
set test to (do shell script "diskutil list | grep /Volumes/Backup")
```


----------



## dLeu (4 Juillet 2006)

zacromatafalgar a dit:
			
		

> Essaye sans le "integer returned"
> 
> ```
> set test to (do shell script "diskutil list | grep /Volumes/Backup")
> ```


Malheureusement, j'ai le même résultat : La commande s'est terminée avec un résultat non nul.

J'ai trouvé ça sur le net : 





> All shell commands return an integer status when they finish: zero means success; anything else means failure. If the script exits with a non-zero status, do shell script throws an AppleScript error with the status as the error number. (The man page for a command should tell you what status codes it can return. Most commands simply use 1 for all errors.) If the script printed something to the standard error stream, that text becomes the error message in AppleScript. If there was no error text, the normal output (if any) is used as the error message.


Mais ça ne m'avance pas beaucoup : La commande diskutil fonctionne bien dans un terminal et pas dans le script.  Et évidemment, la commande "man diskutil" ne donne aucune information sur les valeurs retournées par la commande.  Je ne peux que supposer que la commande a échoué et me renvoie 1.  C'est pourquoi elle a échoué que je cherche.


----------



## Anonyme (4 Juillet 2006)

Salut. 

Dans un (do shell script) quand la commande grep  ne trouve rien le script re&#231;oit l'erreur "La commande s&#8217;est arr&#234;t&#233;e avec un &#233;tat non nul." sinon il retourne une ou plusieurs  lignes  qui contient le texte recherch&#233; par grep.

Essaie ce script, ici, il fonctionne.

```
repeat
	try
		do shell script "/usr/sbin/diskutil list | /usr/bin/grep disk1s1" -- cette ligne retourne une erreur , si grep ne trouve rien
		exit repeat
	end try
	delay 2
end repeat
delay 2
do shell script "/usr/sbin/diskutil unmountDisk /dev/disk1s1 > /dev/null 2>&1 &"
```

Editer :
*unmountDisk* est  pour tout le disque ,*unmount* est pour une partition sur le disque


----------



## dLeu (5 Juillet 2006)

Merci &#224; toi Mac_jac, &#231;a marche parfaitement ici aussi.

Juste une petite question : &#224; quoi sert le *2>&1 & *&#224; la fin de la commande ?


----------



## Anonyme (5 Juillet 2006)

Salut



			
				dLeu a dit:
			
		

> Juste une petite question : &#224; quoi sert le *2>&1 & *&#224; la fin de la commande ?



* 2>&1*  : cela supprime le stderr.
&#199;a redirige le stderr dans le stdout , comme stdout est supprim&#233; par  */dev/null* ,donc le stderr est supprim&#233; lui aussi. cela &#233;vite d'avoir l'erreur "Volume failed to unmount" m&#234;me si le disque est &#233;ject&#233;.

Le dernier "*&*' : cela ex&#233;cute la commande dans le background.


----------



## dLeu (6 Juillet 2006)

Eh bien, merci encore pour toutes ces explications claires, précises et surtout bien utiles.

A +

Didier


----------

