Cree un servicio de automatización llamando a un script de bash y pasando argumentos

1

Estoy intentando automatizar un script de bash que llama a pandoc. Me gustaría resaltar un archivo de reducción en el buscador, luego seleccionar el servicio 'md2tex', que convertirá el archivo de reducción en un archivo .tex. Tengo esto para funcionar bien en la terminal. Sin embargo, cuando intento automatizarlo, no funciona. Cuando abro Automator, creo un nuevo servicio, luego arrastre y suelte 'ejecutar shell script' en la ventana de la derecha. Otras opciones se muestran en la ventana de abajo. He usado el símbolo $ @ para referirme al nombre de la variable (nombre del archivo). La captura de pantalla muestra todas las opciones / configuraciones.

Aparece un mensaje de error extraño 'error de sintaxis en -e línea 1'. Cualquier ayuda apreciada.

    
pregunta Nick Riches 18.05.2018 - 22:55

1 respuesta

3

Primero, cambie la ventana emergente de Shell de / usr / bin / perl a / bin / bash. Eso es lo que está causando el error: está intentando ejecutar el script con perl, y no tiene una sintaxis de perl válida.

Segundo, el script en sí necesita algo de trabajo. $@ se expande a todos los argumentos (en este caso, las rutas de todos los archivos seleccionados), pero su secuencia de comandos solo espera un elemento. Si no quiere que falle si se seleccionan varios elementos, debe hacer que funcione el primero o hacer que se repita en todos los elementos. el bucle suele ser lo que usted desea, y de hecho, cuando agrega esa acción a su servicio de Automator, debe completar automáticamente una plantilla para realizar un bucle sobre los elementos. A continuación, debe colocar comillas dobles alrededor de todas las referencias a rutas de archivos (y referencias variables en general) o los nombres de archivo / carpeta con espacios lo confundirán irremediablemente. A continuación, la (s) ruta (s) que recibirá incluirán el nombre completo del archivo, incluido ".md", por lo que agregar otro ".md" hará que falle. Para obtener el nombre de archivo de salida, es posible que desee eliminar ".md" antes de agregar ", tex".

Aquí está mi puñalada rápida en un guión:

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

Deberá completar la ruta completa del ejecutable pandoc, en lugar de "/ path / to / pandoc" en el script. Probablemente pueda financiar esto ejecutando el comando which pandoc en su shell normal.

Lo hice para omitir cualquier otra cosa que no sean archivos ".md"; Es posible que desee cambiar esa parte. Si es así, es posible que necesite generalizar la parte "${f%.md}.tex" , que elimina una extensión ".md" antes de agregar ".tex", pero si el archivo de entrada tiene una extensión diferente, simplemente agregará ".tex" en Además de todo lo que hay allí. Advertencia: no use "$ {f%. *}. Tex" porque, en algunos casos, se eliminará parte del nombre del directorio en el que se encuentra el archivo.

Ah, y para su uso real como servicio Finder, debe eliminar la acción "Obtener los elementos seleccionados del Finder"; eso es bueno para las pruebas en Automator, pero debe eliminarlo o agregará lo que se haya seleccionado en el Buscador de lo que se supone que debe ejecutarse (probablemente significa que se ejecuta dos veces en todo).

    
respondido por el Gordon Davisson 19.05.2018 - 09:35

Lea otras preguntas en las etiquetas