c++のユニットテストでhttpのモックサーバーをsystem関数で作った時、Ubuntuでうまく動作しませんでした。
system( "echo -e 'HTTP/1.0 200 OK\\r\\nContent-Type: text/plain\\r\\n\\r\\nhoge' | nc -l 8080 > /dev/null &");
system関数は内部的に sh -c "command" の形式で実行されます。つまり、
$ /bin/sh -c "echo -e 'ho\nge'"
のような感じです。echo の -e オプションはエスケープシーケンスを解釈する指定です。
これをUbuntuで実行すると期待する結果になりません。
-e ho
ge
-eが余分です。
これは、Ubuntuでは/bin/shのデフォルトがdashで、dashの組み込みのechoに-eオプションが無いためです。
$ man dash
で確認してみるとたしかに -e オプションはありません。
元のテストコードは次のように /bin/echo にして対処しました。
system( "/bin/echo -e 'HTTP/1.0 200 OK\\r\\nContent-Type: text/plain\\r\\n\\r\\nhoge' | nc -l 8080 > /dev/null &");
まとめ
- 組み込みコマンドと外部コマンドの仕様が異なる場合があるので注意する(echoに限らず)
また、外部コマンドの場合も環境によって仕様が異なる場合もあると思うため、注意が必要です。