Linuxコマンドラインで「&」を受け取る方法

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