perlのsystemとかexecに配列で渡すと「>」リダイレクトが使えない
そもそもなんでperlのsystem,execっで「>」リダイレクトやれ「|」パイプやれをつかうのよ?ってのはありますが、なんかよくわからなかったのでいろいろ質問して教えてもらったので、メモです。
配列で渡すと内部で実行されるexecvpがシェル文字を解釈しないから
perlのドキュメントのexec関数の説明によれば、LISTで渡すと、execvpってライブリコールのが呼ばれて、これのexecvpって関数はシェルを経由しないから、シェル特殊文字の「>」「|」などは理解せず実行するためということです。
また、LISTではなくスカラーで渡すとシェルに渡すということらしいです。
ぼくは、OSコマンドインジェクション対策で、perlでsystemやexecを実行するときは、全部LISTで渡すべし!って覚えていたんですが、LISTで渡す意味がやっと正しくわかった気がします。
ちなみに、そもそも、perlのexecでリダイレクト使うと思ったのは、Seleniumで立ち上げたPhantomJSが吐くログがうざかったので、消し去っておきたかったからですね!
exec 'phantomjs --webdriver=127.0.0.1:9999 > /dev/null';
ちなみに、一応最近のPhantomJSってwebdriverのログを保存する--webdriver-logfileってオプションがあるんですが、これ指定しても、なんか標準出力には出るんですよね、残念ながら。
execvp(3)の3とかそもそもexecvpって何よ?ライブラリコール?よくわからん・・・
なんかyanchaってチャットサービスで、いろいろ聞いたら、そもそもこの話を含めていろいろ教えてもらった。
manで見れるのって全部シェルコマンドだと思っていましたが、いろいろあるんですねー。そもそもmanの見方もにわか仕込みでした。。。ライブラリコール(ライブラリ標準関数)っていうのは要はC言語の関数ってことですかねー。まぁ深く勉強したいところです。
papix,bool_fool++