syncthingサーバ上のファイルをローカルにコピーするスクリプトで、呼び出しているcpコマンドが「ファイルがありまへんで」とエラーを吐いていた。ディバグしてみると、escapeshellarg関数が日本語(というか2バイト文字?)にそのままでは対応していなかったことだった。
対応策はスクリプト内でsetlocaleすること。
mochi227.blog.jp
<?php echo escapeshellarg("あいうえお.txt"). PHP_EOL; echo setlocale(LC_ALL, 0) . PHP_EOL; ?>
kazz@oscar ~# php bin/test/test59.php '.txt' C kazz@oscar ~# cat bin/test/test59.php
<?php setlocale(LC_CTYPE, 'ja_JP.UTF-8'); echo escapeshellarg("あいうえお.txt"). PHP_EOL; echo setlocale(LC_ALL, 0) . PHP_EOL; ?>
kazz@oscar ~# php bin/test/test59.php 'あいうえお.txt' LC_CTYPE=ja_JP.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C kazz@oscar ~#
とりあえずうまくいった。
こんなもんいちいちやらなくてすむ方法はないかと探したが、見つかった解決策はどれもapacheサーバで動かしている事例ばかりで、cliのものは見つからなかった。シェルのlocale設定はできていると思うんだが。