同じロケールでも日本語入力の可否に差がある理由
Linux/BSD初心者です。
Ubuntu15.04
のGNOME端末
より、リモートホストのCentOS6.7
にログインすると
$ echo 'あいうえお'
あいうえお
と行うことができます。
同じことをFreeBSD10.2-stable
で行うと
'あいうえお'と入力してEnter
を押した瞬間にそれまでの入力文字が全て消去されてしまいました。何も入力しなかったかのようになります。
より正確に言うと、(Ubuntu
のGNOME端末
上で)「echo
」と入力後、Mozc
にて日本語変換モードで「あいうえお
」と入力まで行い、それからEnter
を押すと、「echo」と入力した部分も含めて全部バックスペースで消されるような動作をします。
$echo 'あいうえお'
$
BSD
のシェルはsh(ash)
, CentOS
はbash
です。デフォルトから変えていません。
LANG
は共にja_JP.UTF-8
です。
またCentOS
, FreeBSD
共に日本語の書かれたファイルをcat
で表示すると問題なく表示できます。
FreeBSD
のman
でsh
のページを調べると、その末尾にUTF8
以外のマルチバイト文字はサポートしないと書かれていました。逆に言えばUTF8
ならサポートすると解釈できるのですが、これは出力のみサポートという意味なのでしょうか。そんな半端なことはしないような気がするのですが、どういう仕組みで動いているのかわからないので全て想像の域を出ません。
同じ端末からの入力なのでCentOS
に対してもFreeBSD
に対しても同じ電文を送っていると思います。ロケールも揃え、出力に関しては同じ挙動をするのに入力については違う挙動を行うというのは、どういう仕様/設定の違いからくるものなのでしょうか? ご存じの方ご教示おねがいします。
追記
stty -a
の結果比較は次のようになりました。
CentOS
$ stty -a
speed 38400 baud; rows 39; columns 146; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echokeFreeBSD
$ stty -a
speed 38400 baud; 39 rows; 146 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl tab0 -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ;
eol2 = ; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U;
lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;