- ベストアンサー
ロケールをsjisに変更するとログイン時に「イベントがありません」エラーが発生する
- Linux CentOS5でログイン時に「イベントがありません」エラーが発生する問題があります。
- ログインユーザのシェルを/bin/cshに設定している場合、システムロケールをUTF8からSJISに変更するとエラーが発生します。
- エラーが発生すると、cshスクリプトが使えないため、/home/aaa/.cshrcで設定しているPATHなどが正常に読み込まれないようです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> こう書くのが普通なのですね・・・普通、というのがまだわかってないです。/dev/の中にnullなんてものが・・・勉強します! 普通というか、名前無しパイプ(|)を使えば余計なファイルを作成せず、コマンドの標準入力に${path}を内容渡せますし、grepも終了ステータス(cshの場合$status)を見れば一致するものが見つかったかどうか分かるので。 あと、/dev/null は、例えばコマンド結果を画面やファイルに出力したくない場合にその出力を /dev/null に出力すれば破棄してくれる特別ものです。 > ログイン時のエラーはまだ、そのままです。 あれ、そうなんですか。 実際、修正して試したりしていないのでまだエラーになる所があるのかな。 > エラーを再現してくださったディストリは何ですか? > [lean@brynhildr ~]$ cat /etc/redhat-release > CentOS release 5.2 (Final) とあるように CentOS 5.2 です。
その他の回答 (5)
- Lean
- ベストアンサー率72% (435/603)
> echo ${path} > /tmp/wkpath.txt > set tmp_path=`grep /usr/X11R6/bin /tmp/wkpath.txt` > if ($?tmp_path) then > setenv PATH "${PATH}:/usr/X11R6/bin" > endif は、 echo ${path} | grep '/usr/X11R6/bin' >& /dev/null if (${status}) then setenv PATH "${PATH}:/usr/X11R6/bin" endif かな。
補足
ありがとうございます! こう書くのが普通なのですね・・・普通、というのがまだわかってないです。/dev/の中にnullなんてものが・・・勉強します! /etc/csh.login /etc/profile.d/krb5-devel.csh /etc/profile.d/krb5-workstation.csh を変更しました。 ログイン時のエラーはまだ、そのままです。 が、/home/aaa/.cshrcで指定するプロンプトが適用されるようになりました。.cshrcの途中まで適用できています。 プロンプト指定のあとに書いている環境変数は反映されていないので。 何度もありがとうございます。 ところで、Lean様がエラーを再現してくださったディストリは何ですか? よろしければ教えていただきたいです。
- Lean
- ベストアンサー率72% (435/603)
No.2です。 [lean@brynhildr ~]$ cat /etc/redhat-release CentOS release 5.2 (Final) [lean@brynhildr ~]$ cat /etc/sysconfig/i18n #LANG="ja_JP.UTF-8" LANG="ja_JP.SJIS" [lean@brynhildr ~]$ locale -a | grep ja ja_JP ja_JP.SJIS ja_JP.eucjp ja_JP.ujis ja_JP.utf8 japanese japanese.euc japanese.sjis [lean@brynhildr ~]$ csh -f -X /etc/csh.cshrc : if ( -r /etc/profile.d/krb5-workstation.csh ) then source /etc/profile.d/krb5-workstation.csh ~: イベントが見つかりません. [lean@brynhildr ~]$ csh -f -X /etc/csh.login if ( 1 ) then ~: イベントが見つかりません. /etc/csh.cshrc の方が /etc/profile.d/krb5-workstation.csh に、/etc/csh.login は /etc/csh.login 自体にエラーをなる部分があるみたいなので、それぞれのファイルを見ると [lean@brynhildr ~]$ cat /etc/profile.d/krb5-workstation.csh if ( "${path}" !~ */usr/kerberos/bin* ) then set path = ( /usr/kerberos/bin $path ) endif if ( "${path}" !~ */usr/kerberos/sbin* ) then if ( `id -u` == 0 ) then set path = ( /usr/kerberos/sbin $path ) endif endif [lean@brynhildr ~]$ cat /etc/csh.login # /etc/csh.login # System wide environment and startup programs, for login setup if ($?PATH) then if ( "${path}" !~ */usr/X11R6/bin* ) then setenv PATH "${PATH}:/usr/X11R6/bin" endif else if ( $uid == 0 ) then setenv PATH "/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin" else setenv PATH "/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin" endif endif setenv HOSTNAME `/bin/hostname` set history=1000 if ( ! -f $HOME/.inputrc ) then setenv INPUTRC /etc/inputrc endif どちらもif文の中の「!~(文字列比較)」は演算子として正しいのだけれど、ロケールがSJISの時には何故かヒストリ展開されているみたい。 たぶん、/etc/profile.d/krb5-workstation.csh の方が先に読み込まれるのでこっちでエラーになっているのだと思う。 個人的には、もともとロケールにSJISがなく、追加してもこういう状況になるならロケールSJISでは使用しないかな。 PATHの設定で「!~」の右側がPATHに含まれていないならPATHに追加しているので、「!~」以外でPATHに含まれているか調べるようにするか、無条件に付けたりする等して対処かな。
補足
すごいです!ありがとうございます! わざわざ再現してくださったなんて。。。 ご提示くださった2方法のうち、無条件にsetenvにしたら PATHにログインするたびに文字列が増えるように思います。 ログアウトしたら必ず消すようにしたらいいのかもしれないですが。 それでまず、!~を使わないように/etc/csh.loginをカスタマイズしようと試みました。 # /etc/csh.login 略 if ($?PATH) then echo ${path} > /tmp/wkpath.txt set tmp_path=`grep /usr/X11R6/bin /tmp/wkpath.txt` if ($?tmp_path) then setenv PATH "${PATH}:/usr/X11R6/bin" endif else 略 !~のかわりにgrepを使うことにしました・・ これで4行めifに1が返ってきたら、環境変数の文字列が追加されることがわかりました。 cshコマンドXオプションでもエラーは出てません。 今はcsh.loginだけですが、 /etc/profile.d/krb5-workstation.csh のほうもこれでやってみるつもりです。 Cシェルプログラミングは初めてなんですが・・なにかまずいことがあるようでしたら 教えていただければ幸いです。 というか、ここまでご回答くださっただけでも大感激です。 ほんまにありがとうございます。
- Lean
- ベストアンサー率72% (435/603)
No.2です。 > そのプロンプトで!使うの削除して > utf8の状態でhistory 全削除して、 > i18nファイルsjisにして > ログインしてみましたが一緒でした・・。 そうすると システムファイル /etc/csh.cshrc の方かな。 あと、cshと言ってもtcshだろうから、$HOME/.tcshrc があれば $HOME/.cshrc は読み込まないというのもあるし。 また、「su -」してるからログインシェルになると、システムファイルの /etc/csh.login とか $HOME/.login あたりも読み込むだろうから見てみるといいかも。
補足
たびたびありがとうございます。 $HOME/.loginにもプロンプトで!マークを使ってました。 ので!マークは削除してみました。 $HOME/.tcshrcは存在しませんでした。 で、もう一度ログインしてみましたが状況は同じでした・・・ そして、さらにわからないのが [aaa@cenos ~]$ csh ~: イベントが見つかりません. てなることです。 cshスクリプトのあるディレクトリまで移動して [aaa@cenos ~]$ ./scriptname ~: イベントが見つかりません. でもこうなります。 泥沼にはまっています...
- Lean
- ベストアンサー率72% (435/603)
> ~: イベントが見つかりません. cshのヒストリ置換が出来なかった時のメッセージじゃないかな。 ○cshヒストリ置換失敗例 %history 1 14:18 ls 2 14:18 ps 3 14:18 history %!vi vi: イベントが見つかりません. .cshrc内のどこかに ! があったりしますか?
補足
回答投稿ありがとうございます。 !あります。プロンプト指定するのにコマンド番号表示で。 そのプロンプトで!使うの削除して utf8の状態でhistory 全削除して、 i18nファイルsjisにして ログインしてみましたが一緒でした・・。
- Tacosan
- ベストアンサー率23% (3656/15482)
たとえば「/home/aaa/.cshrc の中に日本語が入っている」とかいうことはない?
補足
早速ありがとうございます。 ~/aaa/.cshrcはASKIIなんです。 viなどで見た目には日本語なくても、たとえば改行コードとかおかしくなったりしてんのかとも思ったんですが 調べ方がわからなくて。
補足
毎度ありがとうございます! /dev/nullのこと、勉強になりました・・ よくよく探したら、DBのインスタンスディレクトリにもcshrcがあって、そこで引っかかっていました。 でもそれはたくさん「!~」があってしかもDB関連のファイルなので 修正するのがいやで、 ~aaa/.cshrcの中で setenv LANG ja_JP.UTF-8 source ~/sqllib/dbcshrc setenv LANG ja_JP.SJIS と書いて回避することにしました。 かなり変ですけど dbcshrcはASKIIなんで、!~以外は関係ないはずなんで。。。 csh、SJISのバグっぽいですけど欧米のひとはSJIS使わないんで?ネット上ではちゃんとしたバグ報告は見つからず、いまいち歯切れが悪いですが、 上記の対応でエラーもなくなり、今は事なきを得ました。 Lean様、たくさん、ご教授いただいてほんとにありがとうございました。