Wie kann ich erfassen die komplette Kommandozeile in Perl?
Nehme an, der Anruf wurde
/usr/local/bin/perl verify.pl 1 3 de# > result.log
Innen verify.pl
ich will das ganze Gespräch über und hängen Sie es auf eine log-Datei für tracking-Zwecke.
Wie kann ich capture das ganze nennen wie es ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da ist auch ein Weg (zumindest auf unix-Systemen), um ganze Befehlszeile:
e: Sauberer Weise mit PID (mit freundlicher Genehmigung von Nathan Fellman):
getpid()
print qx/ps -o args $$/;
print qx/ps -o args= $$/
$0
hat der Skript-name und die@ARGV
hat die Argumente, also die gesamte Kommandozeile ist:$commandline = $0 . " ". (join " ", @ARGV);
oder mehr aus (Dank FMc):
$commandline = join " ", $0, @ARGV;
Weiß ich aber nicht wissen, wie zu erfassen, die Umleitung (
> result.log
)$commandline = $0 . " " . (join " ", @ARGV);
um einen Raum zwischen den scriptname und der erste parameter, aber das ist einfach nur dumm, detaildup
s der filedescriptor für STDOUT zu zeigen, dass log-Datei. Perl hat keine Möglichkeit zu wissen, ob dies geschehen ist, so weit ich erzählen kann. (Sie KÖNNTEN in der Lage sein zu erkennen, ob eine Eingabe-Umleitung ist geschehen durch die Verwendung-t
aber.)join
nimmt mehrere Argumente:join(" ", $0, @ARGV)
./usr/local/bin/perl
sollte anders sein als das, was gegeben ist durchwhich perl
?$^X
oder mit$Config{perlpath}
(wenn Sie geladen habenConfig
- Modul).$Config{perlpath}
ist vorzuziehen, in einigen Fällen, weil es ist ein nur-lese-variable.>
's. Allerdings kann man erraten, ob bestimmte Datei-handle ist ein terminal, einer Datei oder einer pipe.which perl
wird wieder die erste auf dem Pfad. Versuchenwhere perl
zu sehen, wenn Sie irgendwelche anderen auf dem Weg.@ARGV
wird verbraucht durchGetOptions()
so müssen Sie dies tun, bevor.$commandline = join " ", $0, @ARGV;
behandelt nicht den Fall, dass Befehlszeile hat, Zitate wie./xxx.pl --love "dad and mom"
Einer Schnellen Lösung:
Versuchen, speichern Sie den folgenden code als
xxx.pl
und führen./xxx.pl --love "dad and mom"
:Hier nahezu gleichen Linux-only-Varianten (natürlich, nach der shell-intervention):
Reine perl
Verwendung von File::Slurp:
Sehen In Perl, wie bekomme ich das Verzeichnis oder der Pfad des aktuellen code ausführen?