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