本日仕事で思わぬところでつまずいてしまったので、備忘録をメモっておきます。
まずやろうとしたことは、とあるWEBサイトのソースコードを取得するプログラムを作成することになったので、安易にPHPでfile_get_contents関数でURLを指定すれば、ソースコードがファイルに保存されるプログラムを構築した。
phpでURL指定
<?php
echo $argv[1].PHP_EOL;
上記のようなソースコードを下記実行してみました。
$ php hoge.php aaaa
aaaa
この状態であればさほど問題ではないのだが、&文字列が含まれる場合エラーになってしまう。
$ php hoge.php aaaa&bbb
[1] 21931
-bash: bbb: command not found
これは、「&」という文字列が、linuxコマンドの「バックグラウンドでコマンドを実行する」という命令の為、コマンドラインの中に含まれていると、文字列ではなく、命令として認識されてしまう。
&の次の文字列がコマンド実行命令として判定され、bbbが文字列ではなく、実行コマンドになるので、「そんなコマンドないよ」とbashエラーが出てしまうのである。
shellでもtry
echo $1
大したプログラムではないが、受け渡しの引数1番目をそのまま表示するコードなのだが、これをPHPと同じように実行すると
$ sh hoge.sh aaa
aaa
さらに&文字列が入ると・・・
$ sh hoge.sh aaa&bbb
[1] 22061
aaa
-bash: bbb: command not found
[1]+ Done sh hoge.sh aaa
PHPとほとんど同じエラーが出ています。
そらそうですよね。コマンドラインということでbashで動いているわけですから。
解決
これを解決するのは非常に簡単で&をエスケープするだけでした。
\&
こんなに簡単なのに、2時間も費やしてしまいました。
脳みその老化なのかと少し自分で心配になってしまうぐらい・・・
$ php hoge.php aaa\&bbb
aaa&bbb
$ sh hoge.sh aaa\&bbb
aaa&bbb
shellもphpもどちらも問題なく値が受け取れました。
改めて最近頭がカッチカチになっている気がするので、脳トレでも頑張ろうかと検討中!!!
関連リンク
http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230589/?rt=nocnt
0 件のコメント:
コメントを投稿