グッドデザイン賞を受賞したウォーターサーバー >>

タイトル通りなのですが、perlスクリプト内でシェルコマンドを実行させる方法が分からなく、困っています。

実行したいシェルコマンドはUNIXのcrontab なのですが・・。

また、perlスクリプト内以外でシェルコマンドを実行する方法はあるのでしょうか??

どなたか分かる方いらっしゃいましたらご教授いただけると幸いです。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

system() 関数とバッククォート(`...`の形式)と open() による方法、それと fork 後に子プロセスで exec する方法があります(但しこれはUNIX系OS以外では正常動作するかどうか分かりません)。



system() 関数を使う場合はコマンドラインから打ったのとほぼ同じです。バッククォートの場合はそのコマンドが標準出力に出力した内容を文字列として受け取れます(これはUNIX系OSでよく使われるシェルの動作とほぼ同じということです)。open() でやる場合はコマンドに対する標準入力を与えるか、またはコマンドからの標準入力を受け取れます。これは open(FP, '| command arg ...') または open(FP, 'command arg ... |') のように最初か最後に | を入れてオープンし、その後それに対して print するか <FP> のような方法で読むかします。fork(), exec() の場合はその後の入出力の接続は(pipe()と組み合わせて使うなどして) 自由に行なえます。

で、やることが crontab への設定ということならば open 使った方法が楽なんじゃないでしょうか。但し crontab -l をやった後に crontab で追加する場合はその間に他のプロセスが編集をしてしまうかも知れないので注意が必要です。(全部書き変えていいなら open(F, '| crontab'); でオープンして print F ...; でただ書いてしまえばいいと思いますが)
    • good
    • 0
この回答へのお礼

回答してくださった方ありがとうございます。参考になりました。しかし未だうまく作動しません・・。新規スレでもう一回質問してみます。ありがとうございました。

お礼日時:2006/03/20 15:33

my $result = `ここにコマンド`;


で試してみて下さい。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシェルスクリプトのbashとperlについて

シェルスクリプトのbashとperlについて
今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。
RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。
学ぶとしたら、bashとPerlのどちらが良いでしょうか。

また、シェルスクリプトはどんな用途や利点がありますでしょうか。
Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。

Aベストアンサー

perlやphpをシェルとしては使い物にはなりません。

コマンドシェルとして使用するには最低限一行ずつ命令を読み取り、その都度実行する仕組みが必要です。
perl等は1行ずつではなくファイルすべてを読み終わってから実行するため、シェルとしては役に立ちません。

イメージでいうと、ログインしてからひたすら文字を入力して、実際に実行されるのは、ログアウトしてからということになります。

シェルスクリプトの利点としては、普段使用しているコマンドをそのままの書式で作成できるというところです。

また、UNIX系のOSであれば何らかのシェルは必ず入っています。Perl等は別途インストールする必要があります。とくに、サーバーを構築する場合はサービスに不要なツールはインストールしたくないので、perl等の言語は入れていない場合も多いです。

Qシェルスクリプト+perl

シェルスクリプト中で1行だけperlを利用したいと思っています。
しかしシェルスクリプトで利用している変数をperlに持っていく方法が分からず悩んでいます。

----------------------
#!/ban/bash
hoge="hogehoge"
perl -e ・・・ ←この中で$hogeを利用したい
----------------------

perlですべて書き直せばできるのですが、1行のためだけに、すべてを修正するのもどうかと思いましたので質問させていただきました。
もしご存知の方いらっしゃいましたらお教えください。

Aベストアンサー

hoge="hogehoge"
perl -e "print \"$hoge\";"
とか
perl -e '$a=1;print $a . "'"$hoge"'";$a=2;...;'
とか

QPerlのexitについて

こんにちは、現在シェルスクリプトからperlを呼び出し、
その実行結果を受け取るというシンプルな所で悩んでいます。

Perlからプログラムの終了時にexitで
値を返しているのですが、どの値を返しても0が返ってきます。
受け取り側はシェルスクリプトです。
exitには何か特殊な要素があるのでしょうか?
ご存知の方がいたらご教授下さい。
よろしくお願いします。

#
#perlのソース
#(i=0の場合・i=1の場合)
#

if(i == 1) {
exit 1;
}
exit 0;

Aベストアンサー

No1です。
if(i == 1) {
exit 1;
}
は、if($i == 1)の間違いでしょう。
$i = 1;とすると$iに1がセットされますが、
i = 1;でiに1をセットしたことにはなりません。(セット出来ません)
従って、exit 0;が実行されます。
但し、念のため、exit 1;の行のみを生かし、ほかは全てコメントにして実行してみたらどうでしょうか。それで0が表示されるようでしたら、シェル側の問題だと思います。

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

Qperlをコマンドラインで実行したい

今はperlをコマンドプロンプト上でファイルをコンパイルして実行結果を別のテキストファイルに出力しています。(printなど)

ただ、こまごまとした置換え・変換などいちいちテキストファイルにperlを書いてコンパイルして出力ファイルを開いて取り出すというやり方にわずらわしさを感じてきました。
簡単なスクリプトであれば、使い捨ての方がよく感じており、
コマンドプロンプトで試してみたのですが、長い文章やソースなどを変数にいれることができず、(改行がEnterにとられてしまう??)また、一行にずらずらとかかなくてはならないので、うまくいきません。

なにか、テキストエディタのような感じで、このようなperlスクリプトをコンパイルできるようなものはあるのでしょうか。

copalというものを使ってみたのですが、
ファイルハンドルなどが使えなかったのでだめでした。

どなたかご協力お願いします。

Aベストアンサー

copy con tmp_0001.pl
perl tmp_myperl_0001.pl %*
del tmp_myperl_0001.pl

メモ帳等で上の3行を書いて ~.bat という名前で保存。
このファイルはパスの通っているフォルダに置く。
仮にこのファイルの名前を myperl.bat としておく。
たとえば file1.txt と file2.txtを処理したかったらコマンドラインで
myperl file1.txt file2.txt
などと打つ。
するとperlスクリプトを入力できるようになるので、好きなだけ書いたら、最後に Ctrl+Z を打って入力終了。
即座にスクリプトが実行される。

前の行を修正したりとかはできないけど、簡単なことならこれで事足りるかと。

参考URL:http://support.microsoft.com/kb/68787/ja

QPerlの正規表現で文字の抽出

Perlを勉強しているのですが正規表現についてよくわからないので教えてください。

$text="【件名】本文"

とあるときに、【】で囲まれた文字列(【】も含む)を抽出し、$textに戻したいのですがどうすればいいのでしょうか?
($textの中身を【件名】としたいのです)

よろしくお願いします。

Aベストアンサー

$1が文字化けする件に関して。
それは、日本語の半分(半角英数分のデータ)しか取り出していないからです。正規表現は日本語用に作られていないので、全角文字も半角英数として文字を処理するはずです。
$t="あいう";
@a=split(//,$t);#あいうを一文字ごとに区切り、配列にする
foreach(@a){print $_,"\n";}
を実行すれば分かります。全て文字化けし、ループは6回繰り返されます。(全角3文字=半角6文字)
一応あれは【】の中身を取り出すことのみを考えたものだったので、以下のようにすれば何とかなります。

$text='あは【件名】本文';
$text=~s/(.*)(\【.+?\】)(.*)/$2/;
print $text,"\n";

あは、を取り出したいなら2行目の$2を$1に。本文、を取り出したいなら$3に書き換えてください。正常に出来ると思われます。
ちなみに言い忘れましたが、$数字と言う変数は、本来正規表現内でのみ有効な変数です。普段は使わないように。(print $1;はエラーにはなりませんが、しない方がいいでしょう。)

$1が文字化けする件に関して。
それは、日本語の半分(半角英数分のデータ)しか取り出していないからです。正規表現は日本語用に作られていないので、全角文字も半角英数として文字を処理するはずです。
$t="あいう";
@a=split(//,$t);#あいうを一文字ごとに区切り、配列にする
foreach(@a){print $_,"\n";}
を実行すれば分かります。全て文字化けし、ループは6回繰り返されます。(全角3文字=半角6文字)
一応あれは【】の中身を取り出すことのみを考えたものだったので、以下のようにすれば何とかなりま...続きを読む

Qperl system関数 引数 フォルダ

perlのsystem関数を使って、コマンドを実行したいのですが、
実行ファイルの引数にフォルダを指定すると、うまく動作しません。

以下のように書いています
system "実行ファイル フォルダ";

実行ファイルは .BATファイルで、
指定しているフォルダには複数のテキストファイルが入っています。
perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。
コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。
windous7でperlはActivePerlを使用しています。


引数にはフォルダを指定できないのでしょうか?
またフォルダを指定できない場合、解決策などはあるのでしょうか?

よろしくおねがいいたします。

Aベストアンサー

> しかしブラウザに
(略)
> が表示されてしまいます。

それは、バッチファイルが出力したものでしょう。
バッチファイルが出力したものも、CGIの出力に混ざってしまいます。
Perl側で対応する場合は、
system '… > nul'
としてください。
あるいは、バッチファイル側で、1行目に
@echo off
という行を追加してもいけるかと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング