- 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_COMMAND
Bash は各コマンドに対して内部でコードを実行します。
コピー/貼り付けに問題がある場合、スクリプトをダウンロードできます。
説明する
(( ))
算術ですbash
。参考http://wiki.bash-hackers.org/syntax/arith_exprPROMPT_COMMAND
:設定されている場合、この値は各デフォルトプロンプトが実行される前にコマンドとして実行されます。バラよりman bash | less +/PROMPT_COMMAND
tput
ANSIエスケープコードをハードコーディングするよりも優れています。バラよりhttp://wiki.bash-hackers.org/scripting/terminalcodesPIPESTATUS
:フォアグラウンドパイプラインで最後に実行されたプロセスの終了ステータス値のリストを含む配列変数(単一のコマンドのみを含めることができます)。バラより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ノートパソコン