題 如何在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')files [\ e [1; 33m]共計\ $(/ bin / ls -lah | / bin / grep -m 1 total | / bin / sed's / total //')b \ n`if [\ $?= 0];然後echo [\ e [32m] ^ _ ^ [\ e [0m ]工作 - [\ e [0m];否則迴聲[\ 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",如果最新的聲明有一個乾淨的結束,這是事實。

如何使其工作,同時保持輸出在同一位置?如果在執行第一個命令之前將if移動到,則可以正常工作。

我想過用它來分配一個變量 if PS1開始時的狀態。其他 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
2018-01-18 08:48


起源




答案:


你可能最好在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 只是為了獲取文件用法


3
2018-01-18 09:24



我很喜歡我所看到的一切,請注意你(尤其是相關聯的巨大例子),但最後一部分聽起來可能導致嚴重的滯後。例如,計時a du -sh . 在$ HOME拍了 真正的0m34.018s,並有4 du:./ Library / ...:權限被拒絕'診斷。定時後一種情況, 真正的0m0.006s  - 幾乎不引人注意。 - Billy McCloskey


我的提示 包含幾個函數,例如

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

那對你有用嗎?


2
2018-01-18 09:43