echoの移植性のなさ(改行抑止)

Redhat系のLinuxSolarisをよく使います。
コマンドの違いはtarのzオプション、gzgrepとzgrep、findのコマゴマした仕様など、いろいろあるんですが意外なところではechoの改行抑止があります。


先日、Linuxで動いていた/bin/shスクリプトSolarisではちゃんと動かない、ということがあり、原因を調べたら次の1行でした。

echo -n `date +%s`

この1行で、Linuxだと改行なしのタイムスタンプ、例えばが「1235256375」、が表示されますが、Solarisだと「-n 1235256375<改行>」という全く違う出力が得られます。


echoの改行抑止の方法は2種類あり、LinuxSolarisでは挙動が変わってきます。さらにややこしいのはただechoと打ったときに呼び出されるのはシェルの内部コマンドのechoであり、/bin/echoとは別物だということです。

Linux

とにかく-n

Solaris

/bin/shのecho、/bin/echoは\c
bashのechoは-n

sh $ echo 'ABC\c'
bash $ echo -n ABC
bash $ /bin/echo 'ABC\c'

移植性を確保する簡単な方法はprintfに書き換えることです。

printf ABC

上記のスクリプトもそのように修正しました。