web-dev-qa-db-ja.com

PS1変数内にbashスクリプトを挿入する方法

私はカスタムPS1変数を作成しましたが、これは非常に混乱します。これが完全に機能するのに最も近いものです:

PS1 = "\ n [\ e [1; 31m]\u @\H [\ e [35m]\@ [\ e [32m] PWD:\ w [\ e [1; 34m]このフォルダには\ $(/bin/ls -1 |/usr/bin/wc -l |/bin/sed's ::: g ')ファイル[\ e [1; 33m]合計\ $(/ bin/ls -lah |/bin/grep -m 1 total |/bin/sed's/total // ')b\n`if [\ $?= 0]; then echo [\ e [32m] ^ _ ^ [\ e [0m ]動作しました-[\ e [0m]; else echo [\ e [31m] O_O [\ e [0m]動作しませんでした-; fi` "

これは前のコードサンプルと同じコードですが、読みやすくするためにブロックに分割され、コメントが付けられています。

_#User@Host [Red]
\n\[\e[1;31m\]\u@\H

#Hour [Purple]
\[\e[35m\] \@ 

#PWD [Green]
\[\e[32m\] PWD: \w 

#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files 

#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n

#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`
_

問題を説明しようとしています:

  • ifは、(たとえば)"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"を実行した後、falseになり得ない条件を探します。これは、最新のステートメントの終了がクリーンな場合にtrueになるためです。

出力を同じ位置に保ちながら、どうすればそれを機能させることができますか?最初のコマンドが実行される前にifを移動すると、正常に機能します。

PS1の開始時に、そのif条件で変数を割り当てることを考えました。次に、この位置にある他のifが、変更されない代替変数を判断します。しかし、残念ながら、私はBashのスキルをまったく持っていません。私はすでに千回ほどそれをやろうとして失敗しました。

このようなもの(しかしよく書かれている):

_PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\` 
...[Some more code in between]...
`if [ \$prev_err = 0 ]
    then echo "No error"
    else echo "There was an error in the statement." 
fi\`"
_

一部の `(バッククォート文字)が間違った場所にあるか、前のコードブロックで省略されています。

2
SOMN

Bashのマニュアルを引用すると、「設定されている場合、値は各プライマリプロンプトを発行する前にコマンドとして実行されます」というPrompt_COMMANDでそのほとんどを実行する方がおそらく良いでしょう。

この巨大な例 も参照してください。

私のは:-

Prompt_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'

これにより、ターミナルウィンドウ間で履歴が同期されます。

次に、問題を単純化するために、bash関数内にできるだけ多くを配置する必要があります。

ところで、ファイルの使用状況を取得するためだけに、du -sh .の方が/bin/ls -lah | /bin/grep -m 1 totalよりも少し便利で簡単であることがわかるかもしれません。

3
Tony Williams

My Prompt には、次のようないくつかの関数が含まれています

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'

それはあなたのために働きますか?

2
l0b0