59 votes

Comment exécuter le shell script à partir de LaTeX ?

J'essaie de faire ce qui suit dans LaTeX :

\documentclass{article}
\begin{document}
\execute{/usr/local/bin/my-shell-script.sh}
\end{document}

L'idée est d'exécuter /usr/local/bin/my-shell-script.sh au moment de .tex traitement du document et injecter sa sortie dans le flux LaTeX. Est-ce possible ?

PS. C'est possible à travers le paquet que j'ai fait : iexec

1 votes

16 votes

C'est drôle que ce sujet soit classé "hors sujet".

1 votes

Peut-être pourriez-vous déplacer votre solution possible avec votre paquet iexec dans une nouvelle réponse avec un court exemple ? Cela pourrait lui donner plus de visibilité que de la cacher dans un post scriptum que tout le monde ne lit pas.

54voto

David Z Points 49476

Je ferais quelque chose comme ce qui suit (partiellement motivé par ce que Roman a suggéré) : faites en sorte que votre fichier LaTeX soit

\documentclass{article}
\begin{document}
\input{scriptoutput.tex}
\end{document}

et générer le fichier scriptoutput.tex en utilisant

/usr/local/bin/my-shell-script.sh > scriptoutput.tex

Vous pouvez encoder ceci dans un makefile si vous voulez qu'il s'exécute automatiquement quand c'est nécessaire. Alternativement, vous pouvez utiliser la fonction TeX \write18 comando ,

\documentclass{article}
\immediate\write18{/usr/local/bin/my-shell-script.sh > scriptoutput.tex}
\begin{document}
\input{scriptoutput.tex}
\end{document}

et je pense que cela permettrait d'exécuter automatiquement le shell script à chaque fois que vous compilez le document. Le site \immediate est nécessaire pour s'assurer que le script est exécuté lorsque LaTeX rencontre la commande, plutôt que d'attendre qu'une page de sortie soit écrite. (Voir cette question pour en savoir plus sur la routine d'expulsion).

0 votes

Votre solution est certainement plus propre que la mienne. La mienne est cependant pratique si vous avez beaucoup de substitutions.

0 votes

David, merci beaucoup, c'est exactement ce que je cherchais !

1 votes

@DavidZ Vous pourriez vouloir utiliser \immediate\write18 au lieu d'un simple \write18 . Sans \immediate l'opération d'écriture peut être mise en mémoire tampon jusqu'au prochain appel de la routine d'expulsion.

42voto

Simon Byrne Points 449

Comme David l'a souligné, vous pouvez utiliser \write18 pour appeler des programmes externes, puis \input le fichier de sortie résultant. Cependant, vous voudrez probablement utiliser \immediate\write18 pour s'assurer que le script est exécuté avant d'appeler le \input .

Alternativement, si vous utilisez des versions plus récentes de pdf(la)tex (après 1.40, je pense), vous pouvez envoyer la sortie directement dans le document, en utilisant une commande d'entrée pipée :

\documentclass{article}
\begin{document}
\input{|"/usr/local/bin/my-shell-script.sh"}
\end{document}

Pour l'une ou l'autre méthode, vous devrez activer les appels de programmes externes. Pour les distributions TeXlive, vous devez appeler latex avec l'option -shell-escape ou pour MikTeX, je crois que l'option est -enable-write18 .

0 votes

Si vous utilisez TeXworks sous Windows, vous pouvez passer la commande --tex-option=--shell-escape au lieu de simplement --shell-escape . Sinon, vous obtiendrez un message d'erreur énigmatique : Désolé, mais "MiKTeX Compiler Driver" n'a pas réussi.

1 votes

El \input Le tuyau fonctionne même avec un tuyau à coquille. Par exemple, \input{|"jq -r .my_key my_file.json | wc"} fonctionne !

10voto

qbi Points 793

Vous pouvez le faire dans TeX. Voici papier (PDF) vous montre comment écrire et exécuter un virus dans TeX. Les mêmes principes s'appliquent à l'exécution d'un shell script. Cependant, à mon avis, il est plus pratique d'écrire un Makefile, qui s'exécute avant votre exécution de LaTeX et insère le résultat.

5voto

CPBL Points 396

Sur Ubuntu 11.10 GNU/Linux

pdflatex --enable-pipes --shell-escape mytexfile

avec

%...
[This section currently is 
\input{|"wc kmb-box.tex| tr -s ' ' | cut -d' ' -f 4"}
% 2000 characters are allowed here

\input{kmb-box}

%...

fonctionne bien. Par exemple, il utilise wordcount (wc) pour indiquer le nombre de caractères contenus dans le fichier kmb-box.tex, qui fait partie du document.

(Si vous voulez des mots plutôt que des caractères, il suffit de changer le nombre dans "-f 4").

0 votes

J'obtiens des erreurs lorsque je passe la commande à "ls". Y a-t-il un problème avec les nouvelles lignes dans la sortie de la commande ?

3voto

Niels Castle Points 5437

Sauf s'il est impératif que le script soit exécuté. tandis que LaTeX est en cours d'exécution, je recommanderais d'utiliser simplement l'option make pour lancer LaTeX et vous script.

J'ai utilisé cette approche pour ajouter le comptage des mots pour les articles et l'inclusion de statistiques sur les références bibliographiques.

Laissez votre script générer un .tex et l'inclure dans votre fichier source LaTeX.

Voici un extrait d'un de mes Makefiles :

TEX =   /usr/texbin/pdflatex
PREVIEW = /usr/bin/open

REPORT  =   SimMon
REPORT_MASTER = $(REPORT).tex

TEX_OPTIONS = -halt-on-error

SimMon:  $(REPORT_MASTER) countRefferedPages
    $(TEX) $(TEX_OPTIONS) $(REPORT_MASTER)
    @$(PREVIEW) $(REPORT).pdf

countRefferedPages: BibTeXPageCount
    cat *.tex | support/BPC/build/Debug/BPC Castle.bib > litteraturTotal.tex

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X