Pregunta

Debido a la presión de fuera de nuestro grupo, tenemos que transferir más de cien scripts de Perl desde SPARC a X86. Esto significa cambiar docenas de líneas de shebang de #!/home/Perl/bin/perl -w A otra cosa, que es un verdadero dolor. ¿Qué es una buena manera de hacer esto (no puedo encontrar nada? Lycos)?

Además, ¿qué sucede cuando nos vemos obligados a pasar de x86 a otra cosa (como Cray, supongo)? ¿Hay alguna forma de "a prueba de futuro"?

¿Fue útil?

Solución

Cambiar las líneas de shebang en masa No es tan malo:

#! /usr/bin/perl

use warnings;
use strict;

use File::Find;

sub usage { "Usage: $0 dir ..\n" }

my @todo;
sub has_perl_shebang {
  return unless -f;
  open my $fh, "<", $_ or warn "$0: open $File::Find::name: $!", return;
  push @todo => $File::Find::name
    if (scalar(<$fh>) || "") =~ /\A#!.*\bperl/i;
}

die usage unless @ARGV;
find \&has_perl_shebang => @ARGV;

local($^I,@ARGV) = ("",@todo);
while (<>) {
  s[ ^ (\#!.*) $ ][#! /usr/bin/env perl]x
    if $. == 1;
  print;
}
continue {
  close ARGV if eof;
}

Dependiendo de lo que tengas, el s/// Es posible que deba ser un poco más inteligente para manejar interruptores como -T Eso debe estar en la línea Shebang.

Agregue una opción administrada en seco con algunos cambios, además de un uso interesante de redo:

my $dryrun;
{
  die usage unless @ARGV;
  $dryrun = shift @ARGV, redo if $ARGV[0] eq "-n";
}

find \&has_perl_shebang => @ARGV;
if ($dryrun) {
  warn "$0: $_\n" for @todo;
  exit 1;
}

Otros consejos

Esta es una de las razones por las que muchas personas abogan por usar #!/usr/bin/env perl en vez de #!/usr/bin/perl:

Perl es multiplataforma. A menos que su código haga uso de XS El código compilado o las rutas, las instalaciones, etc. específicas del sistema, debe estar bien.

Tienes dos opciones:

  1. No uses líneas shebang (perl yourscript.pl).
  2. find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/

En cualquier caso, la línea Shebang no tiene nada que ver con la plataforma de hardware que está ejecutando, y todo con el shell que está ejecutando.

Otra alternativa (podría ser más simple, aunque dudaría en decir "mejor") es, por supuesto, un enlace suave /home/Perl/bin/perl Donde sea el binario real real en los nuevos sistemas ... solo es factible si tiene herramientas de administración de sistemas a granel eficientes que las empresas más normales deberían.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top