La secuencia de comandos de Shell falla en Automator pero funciona si copio / pego en la Terminal

1

Flujo de trabajo que estoy tratando de lograr:

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

Mi script 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 script:

  1. Tome SVG (desde arrastrar y soltar) y exporte múltiples PNG en tamaños específicos
  2. Tome múltiples PNG y fusione 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.ico en la Terminal y todo funcionará bien. ¿Alguna idea de por qué Automator parece no encontrar este comando?
  • A pesar de que la línea 12 no esté funcionando correctamente, esperaría que todas las líneas de arriba funcionen, sin embargo, no veo señales de que funcionen. Al soltar un SVG en el Droplet de Automator, 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á muy apreciada!

    
pregunta Jonathan 19.11.2015 - 20:38

2 respuestas

1

Probablemente haya personalizado la variable de entorno de ruta de búsqueda de comandos PATH para ubicar convert porque no está instalada en una ubicación estándar de OS X.

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

Por otra parte, es una práctica recomendada para los scripts de shell usar rutas absolutas para los ejecutables de comandos, de modo que el script siempre ejecute el que usted deseaba, en lugar de confiar en la ruta de búsqueda, que principalmente pretende ser una conveniencia para interactivos Uso de la concha. Para descubrir la ruta de acceso absoluta al comando convert , ejecute which convert en un shell.

    
respondido por el Chris Page 28.11.2015 - 14:31
0

La página @Chris ofreció una respuesta perfectamente aceptable, ya que 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 se ha probado y no es su script completo, solo un fragmento que reemplazará a la mayoría de su código. Lo actualizaré después de haber tenido la oportunidad de probarlo, pero me parece bien. Es posible que deba exportar la función o algo ( export -f ink ) o manipular las variables de argumento, pero como dije, publicaré una actualización después de que haya tenido la oportunidad de probarlo.

También, como dije antes, @Chris Page ofreció una respuesta que responde bastante a tu pregunta. Esto es simplemente información adicional que está mejor formateada como respuesta en lugar de múltiples comentarios.

Además, es una buena práctica usar siempre los nombres de las variables en minúscula en los scripts de shell para no sobrescribir ninguna de las variables de entorno integradas (algo con lo que he luchado, 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).

    
respondido por el rubynorails 28.11.2015 - 15:10

Lea otras preguntas en las etiquetas