[PHP-users 4240] Re: 引数の相対パスの扱い

Youichi Iwakiri php-users@php.gr.jp
Tue, 11 Dec 2001 21:15:49 +0900


いわきりです

Osamu Shigematsu wrote in <B83BDB78.15F99%shige@ravi.ne.jp>:
 >ところが、ここでカレントディレクトリからの相対パスを渡すと、このスクリプトの
 >所在からの相対パスになるため、正しく動作いないことがわかりました。
 >どのようにすれば、スクリプトからの相対パスではなく、このスクリプトを
 >呼び出した時の相対パスにできるのでしょうか?

<script language="php">
echo "PWD = ".$PWD."\n";
</script>

この結果は如何に?

See PHPマニュアル 第7章 変数 - 定義済の変数
|環境変数
|
|これらの変数は、PHPパーサが実行されている環境からPHPのグローバル変数領域に
|インポートされます。その多くは、PHPを実行したシェルにより提供されたものであり、
|システムが異なると恐らくシェルの種類も異なるので、固定したリストを示すことは
|できません。定義済みの環境変数のリストについては、使用するシェルのドキュメントを
|参照下さい。 
|
|CGI変数を含む他の環境変数は、PHPがサーバーモジュールとして実行されているのか、
|CGIプロセッサとして実行されているのかによらず設定されます。

暇つぶし(現実逃避)に同じ処理を行うスクリプトを書いてみました。

#!/usr/local/bin/php -q
<script language="php">
// filename 'psed'  -- sed (php version)
// 置換以外の機能は未実装(名前負けしてますね)
// ファイル名の替りにディレクトリ名を指定できますが再帰処理は行わず
// tabstop = 4

function usage($reason) {
	echo "\n";
	echo $reason."\n\n";

	echo "Usage: psed pattern replacement [filename] ...\n\n";
	echo "   filename : directory or file\n";
	echo "   Example  \n";
	echo "     $ psed pattern replacement < file1 > file2\n";
	echo "     $ psed pattern replacement file1 file2 ...\n";
	echo "     $ psed pattern replacement dir1 dir2 ...\n";
	echo "     $ psed pattern replacement file1 dir1 file2 ...\n\n";
}

// main
if ($argc >= 3) {
    $script_name = array_shift($argv);
    $pattern     = array_shift($argv);
    $replacement = array_shift($argv);
} else {
	die(usage("Wrong number of arguments."));
}

$files = array();
if (count($argv) == 0) {
	$exec_mode = 1;  /*  stdin/stdout use mode */
	$files[] = "php://stdin";
} else {
	$exec_mode = 0;
	foreach ($argv as $fname) {
		$fname = ereg_replace("/$", "", $fname);
		$fname = (dirname($fname) == '.') ? $PWD.'/'.$fname : $fname;
		switch (filetype($fname)) {
			case 'dir' : 
				if ($dir_h = opendir($fname)) {
					while ($file = readdir($dir_h)) {
						if (strncmp($file, ".", 1)) {           // skip "." and ".."
							$full_path_name = $fname.'/'.$file;
							if (is_file($full_path_name)) {
								$files[] = $full_path_name;
							}
						}
					}
				}
				closedir($dir_h);
				break;			
			case 'file' : 
				$files[] = $fname;
				break;
			default:
				die(usage("$fname not file/directory."));
		}
	}
}

foreach ($files as $fname) {
    $fp = fopen($fname, 'r');
    if(!$fp)
        die(usage("$fname can't open read mode."));

    $buf = '';
 	while(!feof($fp)) {
		$buf .= fread($fp, 4096);
	}
	fclose($fp);
    $buf = mbereg_replace($pattern, $replacement, $buf);
    if (exec_mode) {
        $fname = "php://stdout";
    }
    $fp = fopen($fname, 'w');
    if(!$fp)
        die(usage("$fname can't open write mode."));
    fwrite($fp,$buf);
    fclose($fp);
}
</script>