1 votos

Crear un servicio automator que llame a un bash script y le pase argumentos

Estoy tratando de automatizar un bash script que llama a pandoc. Me gustaría resaltar un archivo markdown en el finder, luego seleccionar el servicio 'md2tex', que convertirá el archivo markdown en un archivo .tex. He conseguido que esto funcione bien en la terminal. Sin embargo, cuando intento automatizarlo, no funciona. Cuando abro Automator, creo un nuevo servicio, luego arrastro y suelto 'run shell script' en la ventana de la derecha. Otras opciones se muestran en la ventana de abajo. He utilizado el símbolo $@ para referirme al nombre de la variable (nombre del archivo). La captura de pantalla muestra todas las opciones / ajustes.

enter image description here

Obtengo un extraño mensaje de error 'error de sintaxis en -e línea 1'. Se agradece cualquier ayuda.

4voto

Nate Puntos 220

En primer lugar, cambia la ventana emergente de Shell de /usr/bin/perl a /bin/bash. Eso es lo que está causando el error -- está tratando de ejecutar el script con perl, y no está en sintaxis perl válida.

En segundo lugar, el propio script necesita algo de trabajo. $@ se expande a todos los argumentos (en este caso, las rutas de todos los archivos seleccionados), pero tu scriptespera sólo un elemento. Si no quieres que falle si se seleccionan varios elementos, debes hacer que opere sólo en el primero, o que haga un bucle sobre todos los elementos. el bucle es normalmente lo que quieres, y de hecho cuando añades esa acción a tu servicio Automator debería auto-llenar una plantilla para hacer un bucle sobre los elementos. A continuación, es necesario poner comillas dobles alrededor de todas las referencias a las rutas de los archivos (y las referencias a las variables en general) o se confundirá irremediablemente con los nombres de archivos/carpetas con espacios. A continuación, la(s) ruta(s) que va a recibir incluirá(n) el nombre completo del archivo, incluyendo ".md", por lo que hay que añadir otro ".md" hará que falle. Para obtener el nombre de archivo de salida, puede eliminar el ".md" antes de añadir ",tex".

Aquí está mi intento rápido en un script:

for f in "$@"
do
    if [[ "$f" = *.md ]]; then
        /path/to/pandoc -s --template=generic.latex "$f" "${f%.md}.tex"
    fi
done

Tendrás que rellenar la ruta completa al ejecutable de pandoc, en lugar de "/ruta/para/pandoc" en el script. Probablemente puedas financiar esto ejecutando el comando which pandoc en su caparazón habitual.

Hice que omitiera todo lo que no fueran archivos ".md"; tal vez quieras cambiar esa parte. Si es así, es posible que tenga que generalizar el "${f%.md}.tex" que elimina la extensión ".md" antes de añadir ".tex", pero si el archivo de entrada tiene una extensión diferente, añadirá ".tex" además de lo que haya. Advertencia: no utilice "${f%.*}.tex" porque en algunos casos eliminará parte del nombre del directorio en el que se encuentra el archivo.

Ah, y para el uso real como un servicio de Finder, es necesario eliminar la acción "Get Selected Finder Items" - que es bueno para las pruebas en Automator, pero hay que quitarlo o va a añadir lo que está seleccionado en el Finder a lo que se supone que se ejecuta en (probablemente significa que se ejecuta dos veces en todo).

1 votos

También hay que tener en cuenta que dejar en el Obtenga los artículos seleccionados del buscador acción cuando el flujo de trabajo se ejecuta como un Servicio hará que se envíe el elementos seleccionados a la Ejecutar Shell script acción dos veces en este caso, primero por el Configuración del servicio y luego por el Obtenga los artículos seleccionados del buscador acción . BTW ¡Buena respuesta! +1

1 votos

@user3439894 Hmm, estaba asumiendo que el Get Selected Finder Items la acción sería sustituir la lista de artículos (generalmente inofensivos, pero no siempre), pero tienes razón: es se suma a la lista de elementos, lo que significa que normalmente se ejecutará dos veces en cada elemento. La excepción es si seleccionas algún elemento en el Finder, y luego haces clic con el botón derecho del ratón en algo que no sea la selección, y eliges Servicios > yourservice; en ese caso, se ejecutará tanto en lo que estaba seleccionado y lo que se ha pulsado con el botón derecho del ratón. No es bueno en cualquier caso, sólo un poco diferente de lo que pensaba.

0 votos

Gracias. He aceptado esto ya que resuelve mi duda principal sobre el paso de variables. Sin embargo, sigo sin conseguir que funcione el script. La razón por la que establecí la ruta a usr/bin/perl es porque cuando probé todas las demás ubicaciones recibí un mensaje de error de que no se encontraba el comando. Así que asumí (erróneamente) que la ubicación de perl era la correcta. En mi ordenador pandoc se encuentra en /usr/local/bin/pandoc. He intentado solucionar este problema creando un enlace simbólico (con sudo) de pandoc a usr/bin/bash. Sin embargo, no se me permite hacer esto. ¿Tal vez debería activar la protección de la integridad del sistema?

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X