簡體   English   中英

Bash 提示變量在 bash 函數中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM