
最後のコマンドの戻り値を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" = yes
PS1_PROMPT() 関数は .bashrc では評価されず、毎回プロンプトで評価されるため、.bashrc の条件は上記では使用できません。$color_prompt
システム全体にエクスポートしたくありません。