2011-05-27 14 views

Respuesta

6

$0 tiene el nombre del script y @ARGV tiene los argumentos, por lo que toda la línea de comandos es:

$commandline = $0 . " ". (join " ", @ARGV);

o, más elegante (gracias FMc):

$commandline = join " ", $0, @ARGV;

Pongo Sin embargo, sepa cómo capturar la redirección (> result.log)

+0

'$ commandline = $ 0. "". (únete a "", @ARGV); 'para obtener un espacio entre el nombre del script y el primer parámetro, pero eso es solo un detalle estúpido –

+1

No creo que puedas, ya que el shell simplemente' dup's el descriptor de archivo para STDOUT para apuntar a ese archivo de registro. Perl no tiene manera de saber si esto ha sucedido, hasta donde sé. (PODRÍA poder detectar si una redirección de entrada ha sucedido usando '-t') –

+0

@Fredrik: Apenas un detalle estúpido: si el usuario intenta ejecutar ese comando, el nombre del script ha cambiado esencialmente ! :-) –

10

No hay manera (al menos en UNIX-systems) para obtener la línea de comandos conjunto:

my $cmdline = `ps -o args -C perl | grep verify.pl`; 
print $cmdline, "\n"; 

e: forma más limpia usando PID (cortesía de Nathan Fellman):

print qx/ps -o args $$/; 
+0

Eso está bien, a menos que tenga más de una instancia de ejecución perl. Puede filtrar esto con 'getpid()' –

+0

@ Nathan Fellman: Sí, puede haber algunos problemas para obtener el correcto de los procesos, pero creo que OP puede decidir por sí mismo cómo filtrar adecuadamente el proceso específico. Por PID o por algún patrón grep o ... –

+3

Estaba pensando en usar algo como 'print qx/ps -o args $$ /;' –

2

$commandline = join " ", $0, @ARGV; no maneja el caso que la línea de comando tiene citas como ./xxx.pl --love "dad and mom"

A Quick Solutio n:

my $script_command = $0; 
foreach (@ARGV) { 
$script_command .= /\s/ ? " \'" . $_ . "\'" 
       :   " " . $_; 
} 

tratar de salvar el siguiente código como xxx.pl y ejecutar ./xxx.pl --love "dad and mom":

#!/usr/bin/env perl -w 
use strict; 
use feature qw (say); 
say "A: " . join(" ", $0, @ARGV); 
my $script_command = $0; 
foreach (@ARGV) { 
    $script_command .= /\s/ ? " \'" . $_ . "\'" 
        :   " " . $_; 
} 
say "B: " . $script_command; 
+0

Esto es asombroso. Esto es exactamente lo que estoy buscando. ¿Puedes explicarme cómo funciona esto? no estoy seguro de lo que estás haciendo aquí – user749632

1

Aquí virtualmente misma sólo Linux variantes (por supuesto, después de la intervención shell):

Perl pura

BEGIN { 
    my @cmd = (); 
    if (open(my $h, "<:raw", "/proc/$$/cmdline")) { 
     # precisely, buffer size must be at least `getconf ARG_MAX` 
     read($h, my $buf, 1048576); close($h); 
     @cmd = split(/\0/s, $buf); 
    }; 
    print join("\n\t", @cmd), "\n"; 
}; 

usando Archivo :: Slurp:

BEGIN { 
    use File::Slurp; 
    my @cmd = split(/\0/s, File::Slurp::read_file("/proc/$$/cmdline", {binmode => ":raw"})); 
    print join("\n\t", @cmd), "\n"; 
}; 
Cuestiones relacionadas