Bashの改行文字

Bashの知らなかった機能。

stty -icrnlで、CRのNLへの置換を抑止しても、対話型Bashでは、EnterやCtrl-Mでコマンドが実行出来る。 cat -vにEnterやCtrl-Mを与えてみると、ちゃんと^Mと表示され、stty -icrnlが効いていることがわかる。

$ echo $'pwd\rls\r' | bash
bash: 行 1: $'pwd\rls\r': コマンドが見つかりません
$ echo $'pwd\rls\r' | bash -i
ちゃんとpwdとlsが実行される

じゃあ、改行文字がCRLFのファイルを実行する時に、bash -i ファイル名で良いのかというと駄目。

$ echo $'pwd\rls\r' > foo
$ bash -i foo
bash: $'pwd\rls\r': コマンドが見つかりません
$ bash -i < foo
これは上記と同じくちゃんと実行される

bash -i < ファイル名ならOK。

追記: 投稿の数分後、ふと、これはreadlineの機能では無いか??と思いつき、bash --noediting -iとしてみると、EnterやCtrl-Mではコマンド実行出来ない。^Mと表示されるだけ。やっぱりreadlineだったようだ。

$ bind -p | grep "C-[jm]"
"\C-j": accept-line
"\C-m": accept-line