El script de Shell falla en Automator pero funciona si copio/pego en la Terminal

Flujo de trabajo que estoy tratando de lograr:

  1. Exportar archivo SVG de Adobe Illustrator a escritorio
  2. Arrastre el archivo SVG desde el escritorio hasta Automator Droplet
  3. Automator ejecuta el script (resumen básico a continuación)
  4. El script se ejecuta y me deja en ICO

Mi guion es:

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

Resumen del guión:

  1. Tome SVG (desde arrastrar y soltar) y exporte múltiples PNG en tamaños específicos
  2. Tome múltiples PNG y combínelos en un ICO
  3. Enviar SVG y PNG originales a la Papelera

Errores / Problemas:

  • Cuando pruebo ejecutar el script en Automator, aparece este error: -: line 12: convert: command not found. Sin embargo, puedo pegar convert ~/Desktop/test_*.png ~/Desktop/Test.icoen la Terminal y todo funcionará bien. ¿Alguna idea de por qué Automator parece no poder encontrar este comando?
  • Aunque es posible que la línea 12 no funcione correctamente, espero que todas las líneas anteriores funcionen, sin embargo, no veo signos de que funcionen. Al colocar un SVG en Automator Droplet, esperaría ver 8 PNG en mi escritorio, pero no aparece nada. Incluso después de eliminar la última línea que mueve los PNG y el SVG original a la papelera, no aparece nada en mi escritorio.

¡Cualquier ayuda será apreciada!

¿Dónde está convert (una suposición es que ha establecido la ruta solo en los archivos de inicio de bash)
Intente incluir la ruta completa para 'convertir' en su comando (como lo sugiere Jonathan).
@Mark, creo que 'convertir' viene con ImageMagick, que se encuentra en /Users/*MI NOMBRE DE USUARIO*/ImageMagick-6.9.0-3
@Trellis Creo que eso ayudó a solucionar un problema, pero todavía me encuentro con otro problema. Editando mi publicación original ahora.
¿Por qué en la última línea del código que publicaste estás copiando el archivo a la Papelera? En mi opinión, no tiene sentido copiar el archivo a la Papelera.
@ user3439894 Buena captura, cambié CP con MV
Excepto que probablemente no desee eliminar el archivo original, ¿solo los archivos png intermedios?
NOTA: Cita tus expansiones variables a menos que estés seguro de que nunca contendrán espacios u otros caracteres que serán interpretados por el shell. En particular, aunque codifique INKa una ruta conocida sin espacios, todos sus usos ~pueden expandirse a una ruta que contenga espacios.

Respuestas (2)

Probablemente haya personalizado la variable de entorno de ruta de búsqueda de comandos PATHpara localizar convertporque no está instalada en una ubicación OS X estándar.

Cuando la acción del script de shell de Automator ejecuta un script, utiliza un shell no interactivo, lo que significa que no ejecuta archivos como ~/.bashrco ~/.bash_profile. Esto significa que utiliza el entorno predeterminado y la ruta de búsqueda de comandos predeterminada.

Además, es una buena práctica que los scripts de shell usen rutas absolutas para los ejecutables de comandos, de modo que el script siempre ejecute el que usted pretendía, en lugar de depender de la ruta de búsqueda, que principalmente pretende ser una conveniencia para el uso interactivo del caparazón. Para descubrir la ruta absoluta al convertcomando, ejecútelo which converten un shell.

Esta debería ser la respuesta aceptada. Casi lo rechazo porque hacia el final, pensé que estabas sugiriendo usar which converten el script de shell , en lugar de simplemente el shell. Eso me hizo dar un vuelco por un segundo, porque mi cerebro no lo interpretó correctamente al principio.
@rubynorails: He actualizado la redacción.

@Chris Page ofreció una respuesta perfectamente aceptable, porque aborda todos sus problemas necesarios, pero luego eché un segundo vistazo a su código y me pregunté por qué no usar una función con un bucle en lugar de todos esos comandos 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

Tenga en cuenta que el código anterior no ha sido probado y no es su secuencia de comandos completa, solo un fragmento que reemplazará la mayor parte de su código. Actualizaré después de haber tenido la oportunidad de probarlo, pero me parece bien. Es posible que deba exportar la función o algo así ( export -f ink) o jugar con las variables de argumento, pero como dije, publicaré una actualización después de haber tenido la oportunidad de probarlo.

Además, como dije antes, @Chris Page ofreció una respuesta que prácticamente responde a su pregunta. Esta es simplemente información adicional que está mejor formateada como una respuesta en lugar de múltiples comentarios.

Además, es una buena práctica usar siempre nombres de variables en minúsculas en los scripts de shell para no sobrescribir ninguna de las variables de entorno integradas (que es algo con lo que he tenido problemas, porque las variables son mucho más fáciles de reconocer, especialmente en una secuencia de comandos grande en un sistema sin una terminal de color para resaltar la sintaxis).