2009-04-06 4 views
6

nehmen an, Sie einen Perl-Skript „foobar.pl“ haben, dass die folgende drucktführen Sie die Ausgabe eines Skripts als eigenständigen bash Befehl

date -R 

nach stdout und Sie wollen was auch immer die Perl-Skript Ausgaben als laufen Standalone Bash-Befehl (Sorgen Sie sich nicht um Sicherheitsprobleme, da diese in einer vertrauenswürdigen Umgebung ausgeführt wird).

Wie erhalten Sie bash, dies als eigenständigen Befehl zu erkennen?

Ich habe versucht mit XARGS, aber das scheint Argumente nur zu einem vordefinierten Befehl übergeben zu wollen.

Ich möchte das Perl-Skript in der Lage sein, jeden beliebigen Befehl auszugeben.

$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 funktioniert, weil bash einen neuen Prozess zu sein scheint laufen und damit die Initialisierung und Einstellungen von bash_profile werden nicht instanziiert.

Antwort

4

Bad:

`perl foo.pl` 
$(perl foo.pl) 

Warum ist das schlecht? Wegen so vieler Gründe; vor allem:

  • Wordsplitting: Was Sie hier tun, um 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 nahmen die ist der Befehl zum Ausführen. In wirklich extrem vereinfachten Fällen wie $(echo 'date +%s') könnte es funktionieren; aber das ist nur eine wirklich schlechte Darstellung von dem, was Sie wirklich hier tun.
  • Sie können keine anderen bash Shell-Funktionen wie Parametererweiterung, Bash-Schlüsselwörter usw. angeben oder verwenden.

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 sauber up!) Ihre temporäre Datei und haben sie in einem portabel beschreibbaren (und sicheren!) Ort.

Denken Sie auch daran, nicht . oder source zu verwenden, um die temporäre Datei auszuführen, es sei denn, Sie möchten wirklich alles in der aktiven Shell ausführen. Wenn Sie . oder source verwenden, können Sie Ihre temporäre Datei danach nicht zuverlässig bereinigen.

Wahrscheinlich die beste Lösung:

perl foo.pl | bash 

Das ist ziemlich sicher allseitige („sicher“ im Zusammenhang mit dem, am wenigsten fehleranfällige) vorausgesetzt, Ihren Perl-Skript gibt richtige bash Syntax, natürlich .

Alternativen, die so ziemlich das Gleiche tun:

bash < <(perl foo.pl) 
bash <(perl foo.pl) 
+0

bash <($ OUTPUT) ist was ich gesucht habe. Es macht einen RIESIGEN Unterschied mit der Rohrleitung, da Sie immer noch die Kontrolle darüber haben - für Eingaben. – yclian

3

Versuchen:

foobar.pl | bash 
+0

export FOO = 'foobar.pl '; $ FOO – ojblass

0

ich das nicht glaube, 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 bekam!

5
`foobar.pl` 
+0

+1 für die Einfachheit. :) –

4

die Perl-Datei Gegeben:

print "date"; 

folgende bash Befehl wird es tun.

> $(perl qq.pl) 
Mon Apr 6 11:02:07 WAST 2009 

Aber das wird in einer separaten Shell ausgeführt. Wenn Sie es wirklich im Rahmen des aktuellen Shell aufrufen wollen, dies tun:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$ 
Mon Apr 6 11:04:59 WAST 2009 
+0

Im Fall $() wird der Befehl "perl qq.pl" in einer separaten Shell ausgeführt, aber der von ihm zurückgegebene Befehl "date" wird in der aktuellen Shell ausgeführt, was, denke ich, was ist er wollte. –

+0

Sie sollten '.' oder' source' nicht verwenden, um die Befehle auszuführen. Sie wissen nie, was das Skript Ihrer laufenden Shell antun wird; Das bedeutet, dass Sie sich nicht darauf verlassen können, dass Sie sogar die Möglichkeit haben, Ihre temporäre Datei sauber zu machen. Das Aufräumen in einer Falle auf EXIT könnte dabei helfen. – lhunath

+0

@lhunath, hast du die Frage nicht gelesen? Sagen Sie dem Raben: "Sorgen Sie sich nicht um Sicherheitsprobleme, da diese in einer vertrauenswürdigen Umgebung ausgeführt wird". Ich nahm an, dass die Ausgabe des Perl-Skripts gesteuert wurde. Und die Verwendung von "." Um speziell die Anforderung zu erfüllen wurde kein neuer Prozess gestartet. – paxdiablo

0

Versuchen mit open ($ fh "- |", $ arg1, arg2 $)