6

以下をstdoutに出力するperlスクリプト「foobar.pl」があるとします。

date -R

そして、そのperlスクリプトがスタンドアロンのbashコマンドとして出力するものをすべて実行したい(これは信頼できる環境で実行されているので、セキュリティの問題について心配する必要はありません)。

これをスタンドアロンコマンドとしてbashに認識させるにはどうすればよいですか?

xargsを使用してみましたが、事前定義されたコマンドにのみ引数を渡したいようです。

perlスクリプトが任意のコマンドを出力できるようにしたいと思います。

$command = 'date -R'
system($command); ## in the perl script 

上記は、既存のcygwin環境で実行したいので機能しません...

foobar.pl | xargs bash -i {}

bashが新しいプロセスを実行しているようであり、bash_profileからの初期化と設定がインスタンス化されないため、上記は機能しません。

4

6 に答える 6

5
`foobar.pl`
于 2009-04-06T03:04:31.263 に答える
4

悪い:

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

なぜこれが悪いのですか?非常に多くの理由のため。最も注目すべき点:

  • ワードスプリット:ここで行っているのは、perlスクリプトの出力を取得し、スペース、タブ、または改行がある場所でチャンクに分割し、実行するコマンドである最初のチャンクへの引数としてそれらのチャンクを取得することです。$(echo 'date +%s')それが機能するかもしれないような本当に非常に単純なケースでは。しかし、それはあなたがここで本当にしていることの本当に悪い表現です。
  • bashパラメータ拡張、bashキーワードなど、他のシェル機能を引用したり使用したりすることはできません。

良いですが、不便です:

perl foo.pl > mytmpfile; bash mytmpfile

perlスクリプトの出力を入れる一時ファイルを作成し、それをbashで実行することはできますが、一時ファイルを作成(およびクリーンアップ!)して、移植可能な(そして安全な)場所に置く必要があるため、不便です。

また、すべてをアクティブシェルで実行する予定がない限り、一時ファイルを使用し.たり実行したりしないでください。sourceさらに、.またはを使用するsourceと、後で一時ファイルを確実にクリーンアップすることができなくなります。

おそらく最良の解決策:

perl foo.pl | bash

もちろん、perlスクリプトが正しいbash構文を出力することを前提とすると、これは非常に安全です(バグが発生しにくい状況では「安全」です)。

ほぼ同じことを行う代替案:

bash < <(perl foo.pl)
bash <(perl foo.pl)
于 2009-04-06T07:11:10.297 に答える
4

perl ファイルが与えられた場合:

print "date";

次の bash コマンドで実行できます。

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

しかし、それは別のシェルで実行されます。現在のシェルのコンテキストで本当に呼び出したい場合は、次のようにします。

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009
于 2009-04-06T03:05:47.827 に答える
3

試す:

foobar.pl | bash
于 2009-04-06T02:53:43.317 に答える
0

これがまさにあなたが探しているものではないと思いますが、私が持っているものです:-)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script

幸運を!

于 2009-04-06T03:00:01.803 に答える
0

open($fh,"-|",$arg1,$arg2) で試してください

于 2009-05-05T15:05:14.317 に答える