Frage

Angenommen, Sie ein Perl-Skript „foobar.pl“ haben, die Folgendes stdout

druckt
date -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.

War es hilfreich?

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 $)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top