私たちは皆、この迷惑な問題を知っています。
$ printf "abc" > some-file
$ cat some-file
abc$
それよりも複雑な場合は、プロンプトを混乱させ、$
現在のカーソル位置を捨てて、見苦しく見える傾向があります。いくつかの解決策があります(例:ここ)、しかし別の欠点があります。 SSHを介して低速システムにログインすると、プロンプトが表示される前に入力を開始できます。通常、入力はバッファリングされ、できるだけ早く表示されます。ただし、接続されたソリューションの場合、入力は削除されます。
私がどうする
- 常に新しい行でプロンプトを開始してください。最後のコマンドの出力が新しい行で終わらない場合そして
- 前のコマンドの実行中に入力された未使用の入力をコマンドラインバッファに保持しますか?
答え1
このソリューションは少し組み合わせますトラブルシューティングと小さなPerl彫刻:
次のコードは、.bashrc
2つの新しい関数inject
とclear_newline
。後者は、印刷プロンプトが必要なときはいつでも呼び出されます。前者は後者内で呼び出されます(詳細はインラインコマンドを参照)。
# injects the arguments into the terminal, from the second link
function inject() {
perl -e 'ioctl(STDIN, 0x5412, $_) for split "", join " ", @ARGV' "$@"
}
# prints a newline if the cursor is not in position 1
clear_newline() {
local curpos # local variable to hold the cursor position
local input # local variable to hold entered input
stty -echo # disable echoing
inject '
' # inject a newline to terminate entered input, '\0' didn't work?
IFS='\n' read -s input # read entered input
echo -en '\033[6n'
# ask the terminal driver to print the current cursor position
IFS=';' read -d R -a curpos # read cursor position
stty echo # enable echoing
(( curpos[1] > 1 )) && echo -e '\033[7m%\033[0m'
# if cursor not in first column, print a % with inverted colours and a newline
stty -echo # disable echoing of input to terminal again
inject "${input}" # inject stored input
stty echo # enable echo
}
PROMPT_COMMAND='clear_newline' # run clear_newline for every prompt
2番目のstty -echo/stty echo
ペアは、挿入された入力を隠すために必要です。 bashはプロンプトが完了するとすぐにそれを印刷します。