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

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(例) を実行した後に false ではなくなる条件を探します"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"。最新のステートメントが適切に終了した場合は true になります。

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

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

こんな感じです(ただし、よく書かれています):

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\`"

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

答え1

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

参照この巨大な例

私のは:-

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

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

次に、問題を単純化するために、可能な限り多くのものを bash 関数内に配置するとよいでしょう。

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

答え2

私のプロンプト次のようないくつかの機能が含まれています。

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

それはあなたにとってうまくいきますか?

関連情報