dポイントプレゼントキャンペーン実施中!

perlスクリプト内でLINUXコマンドのsourceを実行する方法はないでしょうか?

system()を試みたところ、組み込みコマンドだとエラーとなってしまいます。

sourceしたいファイルの内容を解読して$ENV{~~}に設定する方法もあるかと
思いますが、何か単純にできる方法があるのではと思っております。

A 回答 (5件)

sourceコマンドは、今実行しているシェルの環境でファイル中のコマンド群を実行するコマンドです。


なので、perlなどシェルでないものから実行する意味はありません。

なぜsourceコマンドを実行したいと思ったのかを書くと、良いアドバイスが得られるでしょう。

perlの実行時の環境変数を、あるファイル中のexportコマンドによって設定したいと言うことなら、
案1:実行前にシェルでsourceコマンドを実行する(#1さんの回答の通り)
案2:ファイルの中身をperlで解釈して$ENVを設定する(質問にお書きの通り)
    • good
    • 0
この回答へのお礼

ありがとうございます。

実現したかった内容は

source config

%>cat config

source /hoge/hoge/hoge.config
setenv aaa bbbb/ccc/dddd
:
:

など、configファイル内で設定されている環境変数群をPerlスクリプト内で
参照したいという点です。

上記例のように、sourceしたファイルの中にはまた、source指定があり、その先にも・・・
という点からすべての環境変数を自分で解読して、$ENV{}に入れるには手間がかかりすぎ
なんとかしたいという意図でした。

perlスクリプトを実行前にあらかじめsourceコマンドを実行したり、
No1さんのように、実行ファイルを用意すれば済む話なのですが
このようなスクリプトを沢山用意する必要から、極力1つでまとめたいと思っておりました。

お礼日時:2010/12/13 21:02

#2です。



・ setenv や souce を含んだ設定ファイルが何十個もある
・ そこに書いてあるsetenvを実行した上でperlスクリプトを実行したい
・ 追加で作るものは最小限にしたい

と言うことでしょうか?

#!/bin/csh
source $1
shift
perlスクリプト $argv

というスクリプトを作って、第一引数にsourceしたいファイルを書いてそれ以降に本来の引数を書きます。
    • good
    • 0

setenvということはcsh系ですか...



解析が面倒なら、 csh上でsource→perlを実行、とするしか無いでしょう。


#!/bin/csh -f
source config
perl $argv

というスクリプトを Perl.cshとでもしておいて
Perl.csh Perlのスクリプト 引数....
で実行。
Perlのスクリプト毎にCshスクリプトを用意する必要はない


perlのスクリプトの先頭にでも

if ( $ARGV[0] ne '--config' ) {
$com="source config ; perl $0 --config " . join(' ',@ARGV) ;
system( 'csh -f -c \'' . $com . '\'' );
exit ( 0 ) ;
}

とでもして
・普通に実行→上の部分が有効になり、cshでsource→"--config"を付けてperlを実行
・↑で呼ばれたperlは--configが付いているので、上のifはなにもせず通過

ただ、どちらも完璧ではありません。
スクリプト名や、引数に空白文字を含む場合、いろいろと不具合が発生すると思います。
    • good
    • 0

どんなプログラムやスクリプトやフレームワークなどを含むシステムでも、同じ注意事項です(Perl意外でもということ)。



スクリプト言語の正しい呼び出し方は(インタープリター言語として扱う)

[コマンド名] [そのコマンドに対応したスクリプトファイル名]

です。スクリプトファイルを実行してスクリプトとして認識するための仕組みを通常シェルレベルで備わっていて、UNIX系(Linuxを含む)では、そのファイルに実行権が付いていると、実行しようとしますが、何のシェルスクリプトかは実行したシェルにより、そのシェルスクリプトとして実行されます。

実行シェル意外で実行したければNo1の方のように先頭行に、おまじないを書くと、UNIX系のシェルでは、その指定したシェルで実行します。

今回の場合、Perlが、実行シェルです。なので、Perlに先頭のおまじないが効けばいいわけです。つまりSYSETM()が渡す実行環境が実行したユーザーの思うところシェルであれば、そのまま指定したシェルで実行されますが、どうなんでしょうね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考になりました。

お礼日時:2010/12/13 20:53

目的は、そのシェルスクリプトに書かれている環境変数をセットしてPerlを実行したい、ということでよろしいですね?



#!/bin/sh
source そのスクリプト
perl Perlのスクリプト

という感じのシェルスクリプトを作る
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考になりました。

お礼日時:2010/12/13 20:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!