Bashプロンプトは長いコマンドを中断しません

Bashプロンプトは長いコマンドを中断しません

- hostname(screen#):directory$最後のコマンドが正常に完了すると緑、失敗すると赤で表示されるbashプロンプトを設定しようとします。これまで私が持っているのは次のとおりです。実際に操作を実行しますが、コマンドがラップされると表示の問題が発生するようです。

 PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\` - \h(${WINDOW}):\W$\e[00m "

Googleで見つけた質問とても役に立つ投稿です。あるコメントでは、印刷されていない文字をラップしてこの問題を回避すると述べ\\[ました\\]。だから私は以下を試しましたが、問題は解決せず、色の変更も中止されました。

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\`\] - \h(${WINDOW}):\W$\[\e[00m\] "

このプロンプトの構造(色を含む)を維持しながら長いコマンドが正しく表示されるように変更するにはどうすればよいですか?

答え1

奇妙な色のプロンプトが表示されますが、bashは私の端末の幅を知らないようです。改行が間違っています。


これを行うもう一つの正しい方法があります。このコードをあなたのコードに入れるか、~/.bashrc新しいファイルを作成して次の手順を実行しますsource file

PROMPT_COMMAND=$(
    cat<<-'EOF'

    retval=$?

    RED=$(tput setaf 1)
    GREEN=$(tput setaf 2)
    STOP=$(tput sgr0)

    # arithmetic using bash parameter expansion on a array
    if (($retval + ${PIPESTATUS[@]/%/+} + 0)); then
        PS1="\[$RED\]\u@\h:\w$ \[$STOP\]"
    else
        PS1="\[$GREEN\]\u@\h:\w$ \[$STOP\]"
    fi
EOF
)

それはすべて=)

PROMPT_COMMANDBash は各コマンドに対して内部でコードを実行します。

コピー/貼り付けに問題がある場合、スクリプトをダウンロードできます。

出力

説明する

  • (( ))算術ですbash。参考http://wiki.bash-hackers.org/syntax/arith_expr
  • PROMPT_COMMAND:設定されている場合、この値は各デフォルトプロンプトが実行される前にコマンドとして実行されます。バラよりman bash | less +/PROMPT_COMMAND
  • tputANSIエスケープコードをハードコーディングするよりも優れています。バラよりhttp://wiki.bash-hackers.org/scripting/terminalcodes
  • PIPESTATUS:フォアグラウンドパイプラインで最後に実行されたプロセスの終了ステータス値のリストを含む配列変数(単一のコマンドのみを含めることができます)。バラよりman bash | less +/PIPESTATUS
  • cat<<-'EOF'特別ここに文書があります:この-文字はコードをインデントできることを意味し、一重引用符は'EOF'変数が挿入されていないことを意味します。

答え2

2行のプロンプトがあるため、潜在的に長い内容がコマンドラインに影響を与えません。

glennj@homebase ~/tmp
2219 $ set | grep PS1=
PS1='\n\u@\h \w\n\! \$ '

答え3

\\[だけでなく\[\[最初は余分なものがあります。

答え4

これは元の質問に対する直接的な答えではなく、単に使用例です。

@stArdustβの回答に基づいて、端末の右上にバッテリー*ステータスを表示するようにコマンドプロンプトをカスタマイズする正しいソリューションを見つけました。色は内で別々のファイルとして定義されます.bashrc

PROMPT_COMMAND=$(
    cat<<-'EOF'
    function battery_percentage {
        PERCENTAGE=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'percentage' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f2 |cut -d"%" -f1)
        BColor='IGray'
        if [ "${PERCENTAGE}" -lt 15 ]
            then PColor='BlinkIRed'
                 PBackground='On_White'
            else PColor='Gray'
        fi
        echo "\001${!BColor}\002Battery\001${!PColor}\002 ${PERCENTAGE}% \001${Reset}\002"
    }

    function battery_time {
        TIME=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'time' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f4,5)
        echo "\001${IGray}\002${TIME}\001${Reset}\002"
    }

    export PS1="\[\e[s\]\[\e[1;\$((COLUMNS-26))f\]$(battery_percentage) $(battery_time)\[\e[u\]${PS1}"
EOF
)

結局、次のようPS1になります。

\[\e[s\]\[\e[1;$((COLUMNS-26))f\]\001\e[0;38;5;8m\002Battery\001\e[0;38;5;7m\002 82% \001\e[0m\002 \001\e[0;38;5;8m\0023.6 hours\001\e[0m\002\[\e[u\]\[\e[0;38;5;232m\]\[\e[48;5;5m\] \u \[\e[0;38;5;5m\]\[\e[48;5;11m\] \[\e[0;38;5;232m\]\[\e[48;5;11m\]@\H \[\e[0;38;5;11m\]\[\e[48;5;0m\]\[\e[0m\] \[\e[0;38;5;6m\]\w\a \[\e[1;38;5;5m\]→\e[0m

ノート、しかし、コマンド履歴を上下にスクロールするときにカーソル位置決めの問題がありました。


* ThinkPadノートパソコン

関連情報