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

2017年2月5日

Tips サーバー テクノロジー

本日仕事で思わぬところでつまずいてしまったので、備忘録をメモっておきます。 まずやろうとしたことは、とある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

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ