- PR -

Perlでcdやpushdコマンドを実行する際のディレクトリ指定

1
投稿者投稿内容
みす
会議室デビュー日: 2005/09/01
投稿数: 11
投稿日時: 2008-10-23 11:10
お世話になっております、みすと申します。

PerlでOSのコマンド(lsやdirなど)を実行する際にsystem()で呼び出すように実装していますが
cdやpushdのようなディレクトリを指定するコマンドを呼び出すと
指定したディレクトリが存在しないとエラーになってしまいます。

OSのコマンド部分だけコマンドラインで実行すると問題ないため、
system()に渡すときのディレクトリの指定が悪いのだろうとは思うのですが
system()の引数はシングルクォーテーションでかこっているので
スラッシュ(/や\)は文字列として認識されているはずなので、
どこに問題があるのか検討がつきません。
ディレクトリの指定方法やそもそもOSコマンド実行のやり方が悪いのでしょうか?

以下がsystem()の実装です。

・windowsの場合(実行環境:Windows Server 2003 Standard Edition Service Pack1)
system('pushd C:\\hoge');

・linuxの場合(実行環境:Red Hat Enterprise Linux v.4 ES Update3)
system('pushd /hoge');

かなり初歩的な質問で申し訳ありません、どうぞよろしくお願いいたします。
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2008-10-23 20:08
CentOS4.7
system('pushd /var; pwd');

Solaris10
system('cd /var; pwd');

でいずれも問題なく実行できました。
書き方の問題というより環境の問題でしょうか?一応ご参考までに。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-10-23 20:43
こんばんは。

あるかなさんのような例であれば良いのですが、みすさんの例は問題があります。
非常にシンプルに言えば、system('cd /hoge'); はやめて、chdir '/hoge'; にすべき、となります。
pushdの場合は少し複雑ですが、

 system('pushd /hoge');
 〜
 system('popd');

と書くつもりなら、

 use Cwd;
 @dirstack = ();
 …
 push @dirstack, getcwd;
 chdir '/hoge';
 〜
 chdir pop @dirstack;

あたりでしょう。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-10-23 20:54
あと、「指定したディレクトリが存在しないとエラー」は、何も「/hoge がない」と言っている訳ではありませんよ。

恐らく、

 $ LANG=C perl -e 'system("pushd /hoge"); print $!, "\n";'
 No such file or directory

のことなのでしょうが、これは pushd がないと言っているのです。
試しに、"pushd /hoge" の代わりに "exit" としてみれば、同じ結果になるので分かるでしょう。
なぜ無いか、と言えば、それは cd, pushd, exit 等が sh のビルトインコマンドであり、個別にプログラムファイルとして存在しないからです。

なお、あるかなさんの例で問題がないのは、system('cd /var; pwd') が、system('sh', '-c', 'cd /var; pwd') と同等となるためです。systemに渡す文字列中に、* や ; 等の特殊文字があるかないかの違いでしょう。
みす
会議室デビュー日: 2005/09/01
投稿数: 11
投稿日時: 2008-10-24 13:28
あるかなさん、angelさん

お世話になっております、みすです。
丁寧なご回答ありがとうございます。

>これは pushd がないと言っているのです。
>試しに、"pushd /hoge" の代わりに "exit" としてみれば、同じ結果になるので分かるでしょう。
>なぜ無いか、と言えば、それは cd, pushd, exit 等が sh のビルトインコマンドであり、個別にプログラムファイルとして存在しないからです。

ご指摘のとおり、exitにしてみたところ同じ結果になりました。
cdやpushdといったコマンドはOSが持っているものと思っておりました、
勉強不足でお恥ずかしい限りです・・・。

chdirを使用したところ問題なく動作いたしました。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)