Bashscriptの文字列内の条件

Bashscriptの文字列内の条件

失敗した場合は、シェルから前のコマンドの終了コードを印刷したいと思います。そのため、PS1変数を次のように変更しました。/etc/bash.bashrc

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$?] \$ '
#_______________________________________________^^^^_____

ただし、常に前のコマンドの終了コードを印刷します。$?等しい場合、0印刷されないようにテンプレートに条件を追加する方法はありますか?$?

答え1

次のように内部的に条件と式を作成できます$()

echo "$( var=2; echo $var)"

あなたの例では、PS1次のように変数を変更できます。

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $(
    status=$?; (( status != 0 )) && echo "[$status] "
)\$ '

良い:

jackman@b7q9bw1:~ $ echo hello
hello
jackman@b7q9bw1:~ $ sh -c 'exit 42'
jackman@b7q9bw1:~ [42] $ 

答え2

Bash は変数でコードを実行します。PROMPT_COMMANDプロンプトを印刷する前に。実行できる作業の1つは、プロンプトのコンポーネントを計算してから、設定を介してそのコンポーネントを組み合わせることですPS1

PROMPT_COMMAND_set_status () {
  if ((last_status == 0)); then
    PS1_status=
  else
    PS1_status="[$last_status] "
  fi
}
PS1=PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $PS1_status\$ '
PROMPT_COMMAND='last_status=$?; PROMPT_COMMAND_set_status'

関連情報