web-dev-qa-db-ja.com

bash機能によるMCの起動時間が長い

次のbash関数を使用して、コマンドの後に新しい行を確保します。

user at terra in ~
$ echo "m"
m
user at terra in ~
$ echo -n "m"
m↵

そして、.bashrcの関数自体:

function Prompt_command {
    # get cursor position and add new line if we're not in first column
    echo -en "\033[6n" && read -sdR CURPOS
    [[ ${CURPOS##*;} -gt 1 ]] && echo "$(tput setab 1)↵$Prompt_reset"
}
Prompt_COMMAND=Prompt_command

Prompt_COMMANDを設定すると、MCは10〜30秒で起動しますが、コメントするとほぼ瞬時に起動します。

はなぜですか。また、この問題を無効にせずにこれを修正するにはどうすればよいですか。

strace13:59:06を見回したほうがいいですが、そこには9秒の遅延があります...(通常 strace 比較のために)

3
m0nhawk

MCは端末でbashを実行します。 TERMは、MCが実行されている端末と同じ値に設定されたままですが、下位シェルと端末の間のいくつかの交換をバッファリングまたはフィルタリングしているように見えます。

BashがMCの直接サブプロセスとして実行されている場合は、さまざまなカスタマイズを使用することをお勧めします。 MCの下位シェルにはプロンプト行しか表示されないため、カーソル位置を気にする必要はありません。体系的に改行を追加するだけです。

if [[ "$(ps -o comm= -p $PPID)" == "mc" ]]; then
  PS1=$'\n'$PS1
else
  function Prompt_command {
    # get cursor position and add new line if we're not in first column
    echo -en "\033[6n" && read -sdR CURPOS
    [[ ${CURPOS##*;} -gt 1 ]] && echo "$(tput setab 1)↵$Prompt_reset"
  }
  Prompt_COMMAND=Prompt_command
fi

私の知る限り、stdinからの入力を待っています。

`3021  13:58:57 read(0,  <unfinished ...>
3019  13:59:06 <... select resumed> )   = 0 (Timeout)`

あなたはそれが何をしているのかを見つける必要があります。しかし私の推測:

read -sdR CURPOS

このreadを削除して、問題の修正やタイムアウトの変更を試みることができます

3
user17530