Bash 提示不可见颜色

Bash 提示不可见颜色

有没有办法$PS1使用 ANSI 转义序列来隐藏 Bash 提示符 () 中的某些信息,例如“隐形颜色”之类的信息。

$TERM == linux该方法应该是通用的。它不应该使用某些罕见终端类型的特殊隐身功能。隐藏的数据也应该在纯 Linux 控制台 () 中保持隐藏。

答案1

将前景色和背景色设置为相同:

PS1='\[$(tput setab 0)$(tput setaf 0)\]hello\[$(tput sgr0)\]$ '

如果您的屏幕背景颜色不同,那么您将看到一个彩色条,但文本仍然不可见。如果您使用鼠标,您将能够选择、复制和粘贴它,并且粘贴的副本将可见。

通过使用tput而不是硬编码转义码,这将可移植到不同的终端类型。但是,如果您在定义变量的同时定义它们PS1并在提示中使用它们,则可以加快速度。这样,tput每次发出提示时都不会多次调用。

back=$(tput setab 0)
fore=$(tput setaf 0)
none=$(tput sgr0)
PS1='\[$back$fore\]hello\[$none\]$ '

编辑:

制作明显的提示中包含零宽​​度文本,只需按退格键即可。要获取,^?只需按 Ctrl-v,然后按退格键。

PS1='\[hello ^?^?^?^?^?^?\]$ '

为了适应各种宽度的文本:

PS1='This shows\[$(word='This doesn't';bs=${word//?/^?};echo "$word$bs")\]$ '

使用变量可能会违背解析元数据的目的,但是为了完整性我将其包括在内:

text='Something to hide'
PS1='This shows\[$(word=$text;bs=${word//?/^?};echo "$word$bs")\]$ '

或者

PS1='This shows\[$(bs=${text//?/^?};echo "$text$bs")\]$ '

编辑2:

就此而言,你可以这样做:

PS1='This shows$(: This is hidden)$ '

编辑3:

为了使其更加动态,请使用PROMPT_COMMAND设置PS1

$ PROMPT_COMMAND="PS1='This shows\$(: '\$data')$ '"
This shows$ data="This is hidden"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: This is hidden)$ 
This shows$ data="Top Secret"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: Top Secret)$ 

引用可能是一个挑战。如果您可以避免在数据中使用单引号或双引号,该PROMPT_COMMAND技术将可以正常工作。

相关内容