perl bash

Perl script en HereDoc de bash



(4)

Aquí hay otra forma de usar un script de PERL HEREDOC dentro de bash, y aprovecharla al máximo.

#!/bin/sh #If you are not passing bash var''s and single quote the HEREDOC tag perl -le "$(cat <<''MYPL'' # Best to build your out vars rather than writing directly # to the pipe until the end. my $STDERRdata="", $STDOUTdata=""; while ($i=<STDIN>){ chomp $i; $STDOUTdata .= "To stdout/n"; $STDERRdata .= "Write from within the heredoc/n"; MYPL print $STDOUTdata; #Doing the pipe write at the end warn $STDERRdata; #will save you a lot of frustration. )" [optional args] <myInputFile 1>prints.txt 2>warns.txt

o

#!/bin/sh set WRITEWHAT="bash vars" #If you want to include your bash var''s #Escape the $''s that are not bash vars, and double quote the HEREDOC tag perl -le "$(cat <<"MYPL" my $STDERRdata="", $STDOUTdata=""; while (/$i=<STDIN>){ chomp /$i; /$STDOUTdata .= "To stdout/n"; /$STDERRdata .= "Write $WRITEWHAT from within the heredoc/n"; MYPL print /$STDOUTdata; #Doing the pipe write at the end warn /$STDERRdata; #will save you a lot of frustration. )" [optional args] <myInputFile 1>prints.txt 2>warns.txt

¿Es posible algo escribir un script perl en un script bash como heredoc?

Esto no funciona (solo ejemplo)

#/bin/bash perl <<EOF while(<>) { chomp; print "xxx: $_/n"; } EOF

¿Aquí hay una buena manera de incrustar un script perl en un script bash? ¿Quiere ejecutar el script perl desde un script bash y no quiere ponerlo en un archivo externo?


El problema aquí es que el script se pasa a perl en stdin, por lo que tratar de procesar stdin desde el script no funciona.

1. cadena literal

perl -e '' while(<>) { chomp; print "xxx: $_/n"; } ''

Usar una cadena literal es la forma más directa de escribir esto, aunque no es ideal si el script Perl contiene comillas simples.

2. Utilice perl -e

#/bin/bash script=$(cat <<''EOF'' while(<>) { chomp; print "xxx: $_/n"; } EOF ) perl -e "$script"

Si pasa el script a perl usando perl -e , no tendrá el problema estándar y podrá usar los caracteres que desee en el script. Sin embargo, es un poco rotundo hacer esto. Heredocs produce entrada en stdin y necesitamos cadenas. ¿Qué hacer? ¡Oh, lo sé! Esto requiere $(cat <<HEREDOC) .

Asegúrese de usar <<''EOF'' lugar de solo <<EOF para evitar que bash realice una interpolación variable dentro del heredoc.

También puedes escribir esto sin la variable $script , ¡aunque ahora se está volviendo muy peludo!

perl -e "$(cat <<''EOF'' while(<>) { chomp; print "xxx: $_/n"; } EOF )"

3. Sustitución del proceso.

perl <(cat <<''EOF'' while(<>) { chomp; print "xxx: $_/n"; } EOF )

En la línea del # 2, puede usar una función de bash llamada proceso de sustitución que le permite escribir <(cmd) en lugar de un nombre de archivo. Si usa esto, no necesita el -e ya que ahora está pasando perl un nombre de archivo en lugar de una cadena.


Sólo una pequeña corrección de la respuesta de @John Kugelman. Puedes eliminar al cat inútil y usar:

read -r -d '''' perlscript <<''EOF'' while(<>) { chomp; print "xxx: $_/n"; } EOF perl -e "$perlscript"


Sabes que nunca pensé en esto.

La respuesta es " ¡SÍ! " Funciona. Como han mencionado otros, no se puede usar <STDIN> , pero esto funcionó bien:

$ perl <<''EOF'' print "This is a test/n"; for $i ( (1..3) ) { print "The count is $i/n"; } print "End of my program/n"; EOF This is a test The count is 1 The count is 2 The count is 3 End of my program

En Kornshell y en BASH, si rodea el final de la cadena del documento aquí con comillas simples, el documento aquí no está interpolado por el shell.