エラーが返されると、Bash プロンプトに最後のコマンドの終了コードが表示されます。

エラーが返されると、Bash プロンプトに最後のコマンドの終了コードが表示されます。

最後のコマンドの戻り値をPS1.bashrc

今、値がゼロでない場合にのみ表示したいと思います。

Androidシェルは次のとおりです。

${| local e=$? (( e )) && REPLY+="$e|" return $e }

質問:bashに変換する方法は?

答え1

PS1='${?#0}$ '

特別な形を使用します。パラメータ拡張、、、${?#0}は、「文字0が${?}前のコマンド終了コードの最初の文字である場合は、その文字を削除します」を意味します。

最後の終了コードがゼロでない場合は、プロンプトの色を変更することもできます。

PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'

早く

これはif-else三項表現 $(($?==0?0:91))これはカラーコード0;91m(赤、参照)になります。カラーコード)最後のコマンドがゼロ以外の値で終了した場合、そうでない場合0;0m(デフォルトの色)。

答え2

これは私は何を使用しますか?.bashrc:

PS1_PROMPT() {
  local e=$?
  (( e )) && printf "$e|"
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $

$?return $eこれは、値を表示した後に値を保持するというJoLの回答に比べて利点があります。また、基本的に/system/etc/mkshrc同じことをするAndroid Defaultを再設計しました。

$(PS1_PROMPT)変数代入式で設定されている場合を除き、印刷されるたびに評価されるため、一重引用符で囲まれているため、一重引用符は評価されませ$PS1ん。代わりに印刷時間まで延期されます。

あるいは、ilkkachuが提案したように、BashPROMPT_COMMAND特殊変数を使用することもできます。

PS1_PROMPT() {
  local e=$?
  PROMPT_ECODE=
  (( e )) && PROMPT_ECODE="$e|"
  return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"

これの利点の1つは、PS1が印刷されるたびにサブシェルが作成されないことです。

答え3

完全なAndroidPS1は次のとおりです。

${|
    local e=$?

    (( e )) && REPLY+="$e|"

    return $e
}$HOSTNAME:${PWD:-?} $ 

私はそれを認識しませんが、${|次のbashは次のようになります。

PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '

local$()サブシェルなので必要ありません。

答え4

みんなありがとうございます。私の決定はこれです。

PS1_PROMPT() {
  local e=$?
  #(( e )) && printf "$e|" # BW
  (( e )) && printf "\033[01;31m$e\033[00m|"  # color
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"

errno(別名$?)が0以外の場合は赤で表示されます。

"$color_prompt" = yesPS1_PROMPT() 関数は .bashrc では評価されず、毎回プロンプトで評価されるため、.bashrc の条件は上記では使用できません。$color_promptシステム全体にエクスポートしたくありません。

関連情報