Crea un servizio di automazione chiamando uno script bash e passando argomenti

1

Sto cercando di automatizzare uno script bash che chiama pandoc. Vorrei evidenziare un file markdown nel finder, quindi selezionare il servizio 'md2tex', che trasformerà il file markdown in un file .tex. Ho questo per funzionare bene nel terminale. Tuttavia, quando provo ad automatizzarlo, non funziona. Quando apro Automator, creo un nuovo servizio, quindi eseguo il trascinamento della 'shell script' nella finestra a destra. Altre opzioni sono mostrate nella finestra qui sotto. Ho usato il simbolo $ @ per fare riferimento al nome della variabile (nome del file). Lo screenshot mostra tutte le opzioni / impostazioni.

Vienevisualizzatounmessaggiodierrorestrano"Errore di sintassi in -e linea 1". Qualsiasi aiuto apprezzato.

    
posta Nick Riches 18.05.2018 - 22:55
fonte

1 risposta

3

Per prima cosa, cambia il popup di Shell da / usr / bin / perl a / bin / bash. Questo è ciò che sta causando l'errore: sta tentando di eseguire lo script con perl e non è in sintassi perl valida.

In secondo luogo, lo script stesso ha bisogno di un po 'di lavoro. $@ si espande in tutti gli argomenti (in questo caso, i percorsi di tutti i file selezionati), ma lo script prevede solo un elemento. Se non vuoi che fallisca se sono selezionati più elementi, dovresti semplicemente farlo operare sul primo o farlo scorrere su tutti gli elementi. il ciclo è in genere quello che si desidera e, in effetti, quando si aggiunge tale azione al servizio di Automator, è necessario riempire automaticamente un modello per eseguire il loop sugli articoli. Successivamente, è necessario inserire virgolette su tutti i riferimenti a percorsi di file (e riferimenti variabili in generale) o sarà confuso irrimediabilmente dai nomi di file / cartelle con spazi. Successivamente, il percorso (i) che sta per ricevere includerà il nome completo del file, incluso ".md", quindi l'aggiunta di un altro ".md" lo farà fallire. Per ottenere il nome file di output, potresti voler rimuovere ".md" prima di aggiungere ", tex".

Ecco il mio attacco rapido a una sceneggiatura:

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

Dovrai compilare il percorso completo dell'eseguibile pandoc, al posto di "/ path / to / pandoc" nello script. Probabilmente puoi finanziarlo eseguendo il comando which pandoc nella tua shell normale.

L'ho fatto saltare qualcosa di diverso dai file ".md"; potresti voler cambiare quella parte. In tal caso, potrebbe essere necessario generalizzare la parte "${f%.md}.tex" - che rimuove un'estensione ".md" prima di aggiungere ".tex", ma se il file di input ha un'estensione diversa verrà semplicemente virato su ".tex" in Oltre a qualsiasi cosa ci sia. Attenzione: non usare "$ {f%. *}. Tex" perché in alcuni casi questo rimuoverà parte del nome della directory in cui si trova il file!

Oh, e per l'uso effettivo come servizio Finder, devi rimuovere l'azione "Ottieni elementi del Finder Selezionati" - questo è positivo per i test in Automator, ma devi rimuoverlo o aggiungerà tutto ciò che è selezionato nel Finder a ciò che dovrebbe eseguire (probabilmente significa che viene eseguito due volte su tutto).

    
risposta data 19.05.2018 - 09:35
fonte

Leggi altre domande sui tag