3

bash プロンプトをカスタマイズしようとしています。存在しないコマンドを入力したり、何らかの理由で失敗した場合に色を変えたいです。私は bash スクリプトのコーディングにかなり慣れていないので、他のスクリプトを調べて助けを求めましたが、何かが機能していません。これが私のコードです:

export PROMPT_COMMAND="
    PS1='`
        if [ $? -eq 0 ];
            then echo '
                \[\033[00;32m\]┌─\[\033[00;35m\]\u\[\033[01;32m\]@
                \[\033[00;35m\]\h\n\[\033[00;32m\]└─\[\033[01;32m\]
                (\[\033[01;35m\]\W\[\033[01;32m\])\[\033[00;32m\]\$';
         else echo '
                \[\033[00;31m\]┌─\[\033[00;35m\]\u\[\033[01;31m\]@
                \[\033[00;35m\]\h\n\[\033[00;31m\]└─\[\033[01;31m\]
                (\[\033[35m\]\W\[\033[31m\])\[\033[00;31m\]\$';
         fi`\[\033[0m\]'"

実際のコードには改行はありません。PS1 では煩雑になるため、コードを読みやすくするために改行を追加しただけです。

それで、終了ステータスを比較したいのですが、$? 0に。何らかの理由で変数 $? スクリプトではまったく変更されません。0のままなので、誤ったコマンドを発行した場合でも、最初の条件は常に true になります。echo $?を追加してみました。if-case の前のコードに、echo $?を発行しても、これは常に 0 を返します。ターミナルへのコマンドとして、別のものを返します。作業コードを自分のものにコピーしようとしましたが、それでも解決しません。また、外側の引用として'を使用し、2 番目の引用として"を使用した場合にも機能しました。これを変更したのは、スクリプトが(を文字として受け入れないためです。

これがなぜなのか、どうすれば修正できるのでしょうか?

4

2 に答える 2

0

H.-Dirk Schmitt の素晴らしい答えのフォローアップと同じように、これは私にとってはうまくいきます (コードを説明するつもりはありません。コードは私ができるよりも優れています)。

PS1='`
  if [ $? -eq 0 ];
    then echo -n "\[\033\[00;35m\]\u\[\033\[01;32m\]@\[\033\[00;35m\]\h\[\033\[00;32m\](\[\033\[01;35m\]\W\[\033\[01;32m\])\[\033\[00;32m\]\$";
    else echo -n "\[\033\[00;35m\]\u\[\033\[01;31m\]@\[\033\[00;35m\]\h\[\033\[01;31m\](\[\033\[35m\]\W\[\033\[31m\])\[\033\[00;31m\]\$";
  fi`\[\033\[0m\]'

バッシュカラー

于 2013-10-01T20:45:54.933 に答える