Closed4

bashで改行がないとカーソル位置がズレる現象を治す

かめっちかめっち

コマンドの出力の末尾に改行がないと、ターミナルの表示がおかしくなる。
カーソル位置がズレる

root@kpw-app:~# printf "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
bbbbbbbbbbbbbbbbecho "aaaaaaaaa"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

curlの出力や、nanoエディターでの編集後もこの現象に悩まされる。

かめっちかめっち

出力の最後に改行が入っていればこの現象は起こらない。

root@kpw-app:~# printf "bbbbbbbbbbb\n"
bbbbbbbbbbb
root@kpw-app:~# curl -w "\n" http://localhost:5000
Hello
かめっちかめっち

StackOverflowでトリッキーな解決法を見つけた

PS1='$(printf "%$((tput cols-1))s\r")\u@\h:\w\$ '

とすれば見た目上バグらない。
トリッキーな解決法の結果

ただし、コピペすると、printfの出力のあとに大量のスペースが挿入されていることがわかる。

root@kpw-app:~# printf bbbb
bbbb                                                                                                                                       root@kpw-app:~# echo aaaa
aaaa

とりあえずこれを .bashrc に追加して対策することにする。
もっといい解決策あれば知りたい。

かめっちかめっち

解決法を見つけた (大量のスペースが挿入されない方法)
https://serverfault.com/a/1131155

.bashrc の最後に以下のコマンドを追加する。

_set_prompt() {
    IFS=';' read -sdR -p $'\E[6n' ROW COL # カーソルの位置を取得
    [ $COL -ne 1 ] && echo '' # カーソルが1列目にいなかったら改行を挿入
}

PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'_set_prompt'

これで解決。
大量のスペースも挿入されない。めでたしめでたし。

root@kpw-app:~# printf bbbb
bbbb
root@kpw-app:~# echo aaa
aaa
root@kpw-app:~#
このスクラップは4ヶ月前にクローズされました