[英]Bash prompt variables does not work inside a bash function
我正在進行快速定制,但出於某種原因,當我使用
\\u\u003c/code> 、
\\h
和\\W
變量時,它可以完美地工作,但是當我將它們放入函數中時,它們顯示為“\\u”或 \u0026quot;\\W" 而不是它們的值。
...
print_user()
{
echo -e "\001\u\002@\001\h\002"
}
print_dir()
{
echo -e "\001${YELLOW}\002\001\W\002\001${RESET_ATTR}\002"
}
PS1='[$(print_user) on $(print_dir)] $(get_git_repo) \001\n\002$(print_prompt) '
這顯示為:
[\u@\h on \W]
>
如果我像這樣將它們移到函數之外
PS1='[\[\u\]@\[\h\] \[${YELLOW}\]\[\w\]\[${RESET_ATTR}\]] $(get_git_repo) \[\n\]$(print_prompt)'
它工作正常,並顯示帶有用戶名和主機名的當前目錄:
[myusername@arch on ~]
>
這就是 bash 的工作原理嗎? 有沒有不同的方法來做到這一點,所以它會起作用? 為什么在函數內部它不會顯示變量的值,但在函數外部它會顯示?
從手冊頁,下PROMPTING
Bash 允許通過插入許多反斜杠轉義的特殊字符來自定義這些提示字符串,這些特殊字符解碼如下:
[...]
字符串被解碼之后,將其經由參數擴展,命令替換,算術擴展和引用的去除,受promptvars的值擴大shell選項(見禁用了javascript命令的下低於SHELL內置命令的描述)。
當 shell 擴展
$(print_user)
以將\\u\u003c/code>添加到字符串時,解碼它已經太晚了,所以文字字符串
\\u\u003c/code>保留在提示中。
一種替代方法是使用
PROMPT_COMMAND
來執行一個動態定義PS1
的函數,就在它顯示之前,而不是在PS1
本身的值中嵌入命令替換。
make_prompt () {
PS1="[$(print_user) on $(print_dir)] $(get_git_repo)"
PS1+='\[\n\]'
PS1+="$(print_prompt) "
}
PROMPT_COMMAND=make_prompt
現在,
print_user
將在 shell 解碼PS1
的值之前被調用,屆時所有提示轉義都會出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.