Führen Sie die Ausgabe eines Skripts als eigenständiger bash Befehl
Frage
Angenommen, Sie ein Perl-Skript „foobar.pl“ haben, die Folgendes stdout
drucktdate -R
und Sie wollen was auch immer die Perl-Skript gibt als eigenständiges bash Befehl ausführen (nicht über Sicherheitsprobleme, da diese Sorge wird in einer vertrauenswürdigen Umgebung ausgeführt wird).
Wie bekommt man bash diese als eigenständige Befehl zu erkennen?
Ich habe mit xargs versucht, aber das scheint zu wollen, passieren Argumente nur zu einem vordefinierten Befehl.
Ich möchte das Perl-Skript ausgeben können jede beliebige Befehl.
$command = 'date -R'
system($command); ## in the perl script
die oben nicht funktioniert, weil ich es in einer bestehenden Cygwin-Umgebung ausgeführt werden soll ...
foobar.pl | xargs bash -i {}
die oben nicht funktionieren, weil bash einen neuen Prozess zu sein scheint laufen und damit die Initialisierung und Einstellungen von bash_profile werden nicht instanziiert.
Lösung
Bad:
`perl foo.pl`
$(perl foo.pl)
Warum ist das schlecht? Aufgrund der so viele Gründe; insbesondere:
- Wordsplitting: Was Sie hier machen die Ausgabe des Perl-Skript nehmen, sie in Stücke aufgeteilt, wo immer es Leerzeichen, Tabulatoren oder Zeilenumbrüche und diese Stücke als Argumente für die ersten Brocken nehmen, die der Befehl ausgeführt wird. In wirklich extrem simpel Fällen wie
$(echo 'date +%s')
es könnte funktionieren; aber das ist nur eine wirklich schlechte Darstellung von dem, was Sie wirklich hier tun. - Sie können nicht tun, zitieren oder benutzen andere
bash
Shell Funktionen wie Parameter Expansion, bash Schlüsselwörter, etc.
Gut, aber unbequem:
perl foo.pl > mytmpfile; bash mytmpfile
eine temporäre Datei Erstellen Ihrer Perl-Skript der Ausgabe einfügen und dann läuft das mit bash funktioniert, aber es ist unbequem, wie Sie erstellen müssen (und aufzuräumen!) Ihre temporäre Datei und haben es in einem portably beschreibbaren (und sicher! ) Lage.
Auch nicht vergessen, nicht zu verwenden .
oder source
die temporäre Datei auszuführen, wenn Sie wirklich alles in der aktiven Shell beabsichtigen, zu laufen. Außerdem, wenn Sie .
oder source
verwenden, werden Sie nicht in der Lage sein, zuverlässig danach Ihre temporäre Datei zu bereinigen.
Wahrscheinlich die beste Lösung:
perl foo.pl | bash
Diese ist ziemlich sicher allseitige ( „sicher“ im Zusammenhang mit dem, am wenigsten fehleranfällige) Ihre Perl-Skript gibt korrekte bash Syntax, natürlich unter der Annahme.
Alternativen, die tun so ziemlich die gleiche Sache:
bash < <(perl foo.pl)
bash <(perl foo.pl)
Andere Tipps
`foobar.pl`
die Perl-Datei Gegeben:
print "date";
der folgende bash Befehl wird es tun.
> $(perl qq.pl)
Mon Apr 6 11:02:07 WAST 2009
Aber das ist in einem separaten Shell ausgeführt. Wenn Sie wirklich wollen, dass es im Zusammenhang mit dem aufzurufen Strom Shell, dies tun:
$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr 6 11:04:59 WAST 2009
Versuchen:
foobar.pl | bash
Ich glaube nicht, das ist genau das, was Sie suchen, aber es ist, was ich habe: -)
perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script
Viel Glück!
Versuchen Sie, mit open ($ fh "- |", $ arg1, arg2 $)