cygwin CR

cygwinbashの挙動が変わっている
スクリプトをCRLFで保存すると最後にCRがついてしまう(例えば、引数にCRがついてしまう)
スクリプトはLFで保存する

http://www.bookshelf.jp/2ch/win/1121456258.html

838名無し~3.EXEsage2006/10/19(木) 03:01:09 id:Dn7CmAyZ
先日、bashを3.1-8にアップデートしたんですが、CRLFの扱いがCR除去しないに変わったみたいですね。
おかげで、winエディタで書いたCRLF終端なスクリプトがじぇんじぇん使えなくなりました(使ってる環境のディレクトリはすべてバイナリモードでmount)。

本家のメーリングリストをあさってみました。$BASH_ENVにshoptでCR無視指定ができるみたいですけど、
パイプには通用しない(だからwinアプリがはき出すCRLF含みな出力が扱えない)みたいです。
なので本質的な解決策にはならないし、textmodeは使いたくないのでcygwin環境変数に小細工ってワークアラウンドもいやんなかんじです。

んで、結論として新しいbashは使いたくない、になったのでバージョンを2.*系統に戻したいのですが、どうやったらいいですか?
2006/10/19(木) 11:33:55 ID:TH/zUrVz

839名無し~3.EXEsage2006/10/19(木) 11:33:55 ID:TH/zUrVz
>>838
3.1-9は試した?

840名無し~3.EXEsage2006/10/20(金) 11:43:30 id:u4AfFMx+
>>839

すんません会社PCみてみたら自分のアップデート版は3.1-9でした。
んで、previous:3.1-6,current:3.1-9,experimental:3.2-?とためしてみたんですが
みんなCRの影響うける版でした。
んで、対処方法の

$ echo 'shopt -s igncr;#' > /etc/bash_env
$ export BASH_ENV=/etc/bash_env

を3.1-9でやってみたです。端末からのシェルスクリプト起動はまぁ、うまく動くようになったんですが
拡張子.shをsh.exeに関連づけしてshebangbash起動させるとなんでかうまくいかなかったです
(winのシステム環境変数に設定してもだめだった)。

自分はbashに性能的なパフォーマンスはあんまもとめてないのでとにかく作ったスクリプト群が
普通に動くようにしてーです。


841名無し~3.EXEsage2006/10/20(金) 12:04:54 id:mxPR7Od/
>>840
スクリプトの CRLF を LF にしちゃだめなのか?

842名無し~3.EXEsage2006/10/20(金) 12:25:42 id:J1rEjiP9
>>840
拡張子.shで作成したスクリプトファイルをbash.exeに関連付けしてWin上の
ファイラーから常用しています。

3.1-8を入れたら >>840 さんのような現象になったので、3.1-6に戻しました。
その直後に3.1-9がリリースされたので入れましたが、こちらでは問題なく
動いてます。(何か設定をしたわけでもなく、ただ入れただけ)

当方の環境ではディレクトリがすべてテキストモードでマウント(インストール時の
テキストファイルタイプはDOS/textを選択)されてますが、その違いですかね‥‥

843名無し~3.EXEsage2006/10/20(金) 13:08:40 id:u4AfFMx+
>>842
おお、3.1-9でいけましたか。テキストモードの差かもしんないですね。
ただ、自分おおざっぱな性格なんで確認もおおざっぱだったかもです。
(手元のPCでなく会社PCなので確認バージョンに自信がなくなってきますた。。)
もいちどバージョンに気ぃつけてテストしてみたいとおもいます。
自分、今日から日本にいなくなるので水曜テストしてまた来ます。

>>841
基本一つのディレクトリにスクリプト書きためてるんでガリっと
d2uしてもいいんですが、アドホックなやつはあちこちに
保存しちゃってるんでそれを再利用するときに悩むのがイヤかもです。

848838sage2006/10/27(金) 01:41:26 id:KyHMO5XK
会社PCのbashバージョン確認しました。やっぱ3.1-9でした。 以下確認したことです。

確認バージョン :3.1-9 bash ,ディスクマウント:バイナリモード
確認スクリプトは以下。
#!/usr/bin/bash
date

・igncr指定無し ,端末からのスクリプト起動
 ->NG,dateコマンドが見つからない
・igncr指定有り ,端末からのスクリプト起動
 ->OK,dateコマンドが実行される
・igncr指定有り ,sh.exe関連付け起動,shebang bash起動
 ->NG,dateコマンドが見つからない
・igncr指定有り ,bash.exe関連付け起動
 ->OK,dateコマンドが実行される
・igncr指定有り ,端末からコマンド置換したコマンドを実行,$(perl -e 'print "date\r\n"')
 ->NG,dateコマンドが見つからない

その他かくにんしたこと
・igncr指定有り ,端末からコマンド置換したコマンドを実行,$(perl -e 'print "date\n"')
 ->OK,dateコマンドが実行される
・igncr指定有り ,winプログラム出力からのpipe,tasklist|while read line ;do echo $line|od -c;done
 ->OK,行毎にきちんとループがまわる。

ようは以下ってことですかねえ。
bashアップグレードして似た問題にでくわしたらignrcr指定する
・*.shはbash.exeに関連付けしたほうがかたい
・コマンド置換のパース不具合はexpの3.2-3でfixされてるくさい

得た教訓はアップグレード前はANNOUNCEMENTきちんと読まなきゃいかんってことです。