Le script shell échoue dans Automator mais fonctionne si je copie / colle dans Terminal

1

Le flux de travail que j'essaie d'atteindre:

  1. Exporter un fichier SVG depuis Adobe Illustrator vers le bureau
  2. Faites glisser le fichier SVG du bureau sur Automator Droplet
  3. Automator exécute le script (résumé de base ci-dessous)
  4. Le script s'exécute et me laisse avec ICO

Mon script est:

ROOT=~/Desktop/
TRASH=~/.Trash/
INK=/Applications/Inkscape.app/Contents/Resources/bin/inkscape

$INK --export-png $ROOTtest_256.png -w 256 -h 256 $1
$INK --export-png $ROOTtest_128.png -w 128 -h 128 $1
$INK --export-png $ROOTtest_064.png -w 064 -h 064 $1
$INK --export-png $ROOTtest_048.png -w 048 -h 048 $1
$INK --export-png $ROOTtest_040.png -w 040 -h 040 $1
$INK --export-png $ROOTtest_032.png -w 032 -h 032 $1
$INK --export-png $ROOTtest_024.png -w 024 -h 024 $1
$INK --export-png $ROOTtest_016.png -w 016 -h 016 $1
convert $ROOTtest_*.png $ROOTTEST.ico
cp $ROOTtest_*.png $1 $TRASH

Résumé du script:

  1. Prenez SVG (par glisser / déposer) et exportez plusieurs PNG à des tailles spécifiées
  2. Prendre plusieurs PNG et fusionner en un seul ICO
  3. Envoyez les SVG et PNG originaux à la corbeille

Erreurs / problèmes:

  • Lorsque je teste exécuter le script Automator je reçois cette erreur: -: line 12: convert: command not found. Cependant, je peux coller convert ~/Desktop/test_*.png ~/Desktop/Test.icodans Terminal et tout ira bien. Aucune idée pourquoi Automator ne semble pas pouvoir trouver cette commande?
  • Même si la ligne 12 ne fonctionne peut-être pas correctement, je m'attendrais quand même à ce que toutes les lignes situées au-dessus fonctionnent correctement, mais je ne vois aucun signe qu'elles fonctionnent. En déposant un fichier SVG sur l’automate Droplet, j’espérais voir 8 PNG sur mon bureau, mais rien n’apparaît. Même après la suppression de la dernière ligne qui déplace les fichiers PNG et SVG d'origine dans la corbeille, rien ne s'affiche sur mon bureau.

Toute aide est la bienvenue!

Jonathan
la source
Where is convert (une hypothèse est que vous avez défini le chemin uniquement dans les fichiers de démarrage bash)
Mark
2
Essayez d'inclure le chemin complet de «convertir» dans votre commande (comme suggéré par Jonathan).
Treillis
@Mark Je crois que 'convert' est venu avec ImageMagick qui se trouve dans / Users / * MY USERNAME * / ImageMagick-6.9.0-3
Jonathan
1
Pourquoi dans la dernière ligne du code que vous avez posté, vous copiez le fichier dans la corbeille? OMI Cela n'a aucun sens de copier le fichier dans la corbeille.
user3439894
1
REMARQUE: Citez vos extensions de variable, sauf si vous êtes certain qu'elles ne contiendront jamais d'espaces ou d'autres caractères qui seront interprétés par le shell. En particulier, bien que vous codiez en dur INKdans un chemin connu sans espaces, toutes vos utilisations ~peuvent être étendues à un chemin contenant des espaces.
Chris Page

Réponses:

1

Vous avez probablement personnalisé la variable d'environnement de chemin de recherche de commande PATHà localiser, convertcar elle n'est pas installée dans un emplacement OS X standard.

Lorsque l'action de script shell Automator exécute un script, elle utilise un shell non interactif, ce qui signifie qu'elle n'exécute pas de fichiers tels que ~/.bashrcou ~/.bash_profile. Cela signifie qu'il utilise l'environnement par défaut et le chemin de recherche des commandes par défaut.

De plus, il est recommandé aux scripts shell d’utiliser des chemins absolus pour les exécutables de commande afin que le script exécute toujours celui que vous souhaitez, au lieu de s’appuyer sur le chemin de recherche, qui est avant tout un outil pratique pour une utilisation interactive des fichiers. coquille. Pour découvrir le chemin absolu de la convertcommande, exécutez-le which convertdans un shell.

Chris Page
la source
Cela devrait être la réponse acceptée. J'ai presque voté contre parce que vers la fin, je pensais que vous proposiez d'utiliser which convertle script shell plutôt que simplement le shell. Cela m’a jeté une boucle pendant une seconde, parce que mon cerveau ne l’avait pas interprété correctement au début.
rubynorails
1
@rubynorails: j'ai mis à jour le phrasé.
Chris Page
0

@Chris Page offrait une réponse parfaitement acceptable, car elle répond à tous vos problèmes, mais j'ai jeté un second coup d'œil à votre code et je me suis demandé pourquoi ne pas utiliser une fonction avec une boucle à la place de toutes ces commandes variables.

ink() {
  square_dimension="$2"
  infile="$1"
  /Applications/Inkscape.app/Contents/Resources/bin/inkscape --export-png "${root}/test_${square_dimension}.png" -w ${square_dimension} -h ${square_dimension} "$infile"
}

for i in {256,128,64,48,40,32,24,16}; do ink "$1" "$i"; done

Notez que le code ci-dessus n'a pas été testé et qu'il ne s'agit pas de votre script complet, mais simplement d'un extrait de code qui remplacera la majorité de votre code. Je mettrai à jour après avoir eu la chance de le tester, mais cela me semble bien. Vous devrez peut-être exporter la fonction ou quelque chose ( export -f ink) ou manipuler les variables d'argument - mais comme je l'ai dit, je publierai une mise à jour après avoir eu la chance de la tester.

En outre, comme je l’ai déjà dit, @Chris Page a fourni une réponse qui répond plutôt bien à votre question. Il s’agit simplement d’informations supplémentaires qui sont mieux formatées sous forme de réponse plutôt que de commentaires multiples.

En outre, il est recommandé de toujours utiliser des noms de variables minuscules dans les scripts du shell afin de ne pas écraser les variables d’environnement intégrées (problème avec lequel j’ai eu du mal, car les variables sont tellement plus faciles à reconnaître - en particulier dans un script volumineux sur un système sans terminal coloré pour la coloration syntaxique).

rubynorails
la source