qiitaにシェルスクリプトのecho関連の記事を2本投稿しました

qiita.com

qiita.com

こういう記事はqiitaに書くかブログに書くか迷いますね。

とりあえず技術的な話はqiitaに書いたとして、ここには雑談的なことを書くことにしましょう。

echoに関するのこの問題は、shellspec の開発中に問題になりました。

shellspecはPOSIX互換のシェルで動く方針であるため、各シェルの互換性問題を解決しなければなりませんでした。一番基本であるechoに互換性がなかったのは辛かったですね。

shellspecはユーザーが書いた文字列をエラーメッセージとして(しかも色付きで)表示することがあるため、文字列にエスケープシーケンスが入る可能性を否定できません。引数の文字列をそのまま出力する必要があります。文字列をそのまま出力するには printf '%s\n' を使えば良いのですが、そうすると一部のシェルで極端に遅くなってしまいました。ビルトインではなく外部コマンドのprintfを呼び出しているからです。WSL上だとさらに遅くなってしまいました。

printfがなくともZSHやKSHでは似たような事ができるprintが使えるので問題ないのですがposhが大変でした。(使ってる人は殆ど居ないと思うんですが)

poshはprintfはビルトインではない。printはない。どうしたもんかと。仕方がないのでエスケープ文字の\\\に変換するようロジックで頑張ることになりました。まあ大したコードじゃないですけどね。

もちろんそのテストはshellspec自身で行っています。