使用从 pwd 派生的动态文本编辑终端提示
Editing Terminal promt with dynamic text derived from pwd
简短版
使用这个提示得到这个绿色:
这一行:
export PS1="\w: \[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\] $ "
但是要在函数内部工作所以
my_function(){
echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
# echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
export PS1="\w: $(my_function) $ "
不幸的是我得到这个提示:~/Work/temp/prompt_test: \[\][GREEN]\[\] $
*您不能使用 $(my_function)
而不是 $(my_function)
- 为什么?下面详细解释。
详细说明
我正在尝试满足 2 个条件:
条件一
我可以用这段代码给提示添加颜色:
export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "
但是如果我输入一个长命令,然后单击 home
+ end
- 事情变得一团糟 - 复制行为:
export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "
- 键入一个长命令(无回车):
longg command with many charterssssssssssssssssssssssssssssssssssssss
- 点击
home
- 点击
end
- 尝试使用
backspace
删除所有字符
我可以修复在 color commands
之前和之后添加 \[
和 \]
:
export PS1="\w: \[$(tput setaf 2)\]GREEN\[$(tput sgr 0)\] $ "
问题解决了。
让我们调用“防止那个问题”条件 1
条件 2
让 PS1 行在每次目录更改时 动态地 求值。
所以给出以下结构(基本上制作两个文件夹:mkdir blue red
)
两个文件夹:
+-- 红色
+-- 蓝色
然后是一个简单的 bash 函数来检查 pwd
是否包含 blue
或 red
然后添加颜色以提示所以每当我更改为 [=30= 的文件夹时] 我得到的路径 blue
,与 red
相同
change_color2(){
local my_pwd=$(pwd)
if [[ $my_pwd == *"blue"* ]]; then # path containing 'blue'
echo "$(tput setaf 4)<BLUE>$(tput sgr 0)"
elif [[ $my_pwd == *"red"* ]]; then # path containing 'red'
echo "$(tput setaf 1)<RED>$(tput sgr 0)"
fi
}
export PS1="\w: $(change_color2) $ "
cd red
cd blue
请注意,如果我使用 $(change_color2)
而不是 $(change_color2)
,这将不起作用
我想同时满足这两个条件,但我做不到 - 你能帮忙吗?
谢谢。
Ubuntu 20.04
/bin/bash
正如 pynexj 在他的回答中提到的 This Answer 解决方案是使用 PROMPT_COMMAND
这是一个在 PS1.
之前被评估的函数
所以我能做到
my_function(){
echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
# echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
update_PS1 () {
PS1="\w: $(my_function) $ "
}
PROMPT_COMMAND=update_PS1
# export PS1="\w: $(my_function) $ "
这次在 update_PS1
中我使用的是 $(my_function)
,而不是 $(my_function)
但没关系 - 由于使用 PROMPT_COMMAND
PS
每次更改新文件夹时都会评估变量。
简短版
使用这个提示得到这个绿色:
这一行:
export PS1="\w: \[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\] $ "
但是要在函数内部工作所以
my_function(){
echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
# echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
export PS1="\w: $(my_function) $ "
不幸的是我得到这个提示:~/Work/temp/prompt_test: \[\][GREEN]\[\] $
*您不能使用 $(my_function)
而不是 $(my_function)
- 为什么?下面详细解释。
详细说明
我正在尝试满足 2 个条件:
条件一
我可以用这段代码给提示添加颜色:
export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "
但是如果我输入一个长命令,然后单击 home
+ end
- 事情变得一团糟 - 复制行为:
export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "
- 键入一个长命令(无回车):
longg command with many charterssssssssssssssssssssssssssssssssssssss
- 点击
home
- 点击
end
- 尝试使用
backspace
删除所有字符
我可以修复在 color commands
之前和之后添加 \[
和 \]
:
export PS1="\w: \[$(tput setaf 2)\]GREEN\[$(tput sgr 0)\] $ "
问题解决了。 让我们调用“防止那个问题”条件 1
条件 2
让 PS1 行在每次目录更改时 动态地 求值。
所以给出以下结构(基本上制作两个文件夹:mkdir blue red
)
两个文件夹:
+-- 红色
+-- 蓝色
然后是一个简单的 bash 函数来检查 pwd
是否包含 blue
或 red
然后添加颜色以提示所以每当我更改为 [=30= 的文件夹时] 我得到的路径 blue
,与 red
change_color2(){
local my_pwd=$(pwd)
if [[ $my_pwd == *"blue"* ]]; then # path containing 'blue'
echo "$(tput setaf 4)<BLUE>$(tput sgr 0)"
elif [[ $my_pwd == *"red"* ]]; then # path containing 'red'
echo "$(tput setaf 1)<RED>$(tput sgr 0)"
fi
}
export PS1="\w: $(change_color2) $ "
cd red
cd blue
请注意,如果我使用 $(change_color2)
而不是 $(change_color2)
我想同时满足这两个条件,但我做不到 - 你能帮忙吗? 谢谢。
Ubuntu 20.04
/bin/bash
正如 pynexj 在他的回答中提到的 This Answer 解决方案是使用 PROMPT_COMMAND
这是一个在 PS1.
所以我能做到
my_function(){
echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
# echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
update_PS1 () {
PS1="\w: $(my_function) $ "
}
PROMPT_COMMAND=update_PS1
# export PS1="\w: $(my_function) $ "
这次在 update_PS1
中我使用的是 $(my_function)
,而不是 $(my_function)
但没关系 - 由于使用 PROMPT_COMMAND
PS
每次更改新文件夹时都会评估变量。