ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

備忘メモ(RHEL 9.5でcsh入れてロケールSJISにしたらバックスラッシュのエスケープが効かなくなった)

ベンダーさんにRHEL9.5入れて貰って、お客さんの希望でcshSJISロケールをセットアップして貰ったらバックスラッシュ('\')のエスケープが効かなくなってコマンド複数行分割ができなくなったので、Windows-31JじゃなくてSHIFT_JIS使ってんじゃねーの?と思い検証してみた。

環境

  1. OS:Linux (rhel 9.5) on Azure
  2. その他HW諸々設定:デフォルト
  3. 作業ユーザ:簡易性の為終始 root

セットアップ

# yum install glibc-locale-source
# yum install glibc-langpack-ja
# yum install csh

一応、SHIFT_JISWindows-31Jが入っていることを確認

# ls /usr/share/i18n/charmaps

SHIFT_JISを使ってja_JP.SJISWindows-31Jを使ってja_JP.SJIS2を作成

# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# localedef -f WINDOWS-31J -i ja_JP ja_JP.SJIS2

まずSHIFT_JISの方をロケールにセット

# localectl set-locale LANG=ja_JP.SJIS
# source /etc/locale.conf

テスト。

# csh
0: イベントが見つかりません.
# ls \
ls: '\' にアクセスできません: そのようなファイルやディレクトリはありません

エスケープが効いてないことを確認。 因みにcsh切り替えで"0: イベントが見つかりません." と出ているのはおそらくこれ(↓)が原因。チルダやバックスラッシュが誤認識されるのだろう。

atmarkit.itmedia.co.jp

erattaだとこの辺?(https://access.redhat.com/errata/RHEA-2021:0170) RedHatSJISをサポートしない方針に変わったのは、この辺の対応が面倒になったからだろうと推測。

ともあれ一旦cshを抜けてbashに戻る。

# exit

引き続きWindows-31Jの方をセット。こちらの場合はイベントが見つかりません的なエラーメッセージは出ない。

# localectl set-locale LANG=ja_JP.SJIS2
# source /etc/locale.conf
# csh
# ls \
? /usr/
bin  games  include  lib  lib64  libexec  local  sbin  share  src  tmp

そしてエスケープが効いており、/usr/の内容が表示されていることを確認。

うぇーい。

補足

以下によるとWindows-31J判定できないアプリもあるらしいぞ。適度に使い分け推奨の様だ。 access.redhat.com