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.