Bash 提示不可见颜色

myk*_*hal 3 bash command-line

有没有办法在 Bash 提示 ( $PS1) 中隐藏一些信息,例如使用 ANSI 转义序列的“不可见颜色”之类的东西。

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

Den*_*son 5

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

PS1='\[$(tput setab 0)$(tput setaf 0)\]hello\[$(tput sgr0)\]$ '
Run Code Online (Sandbox Code Playgroud)

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

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

back=$(tput setab 0)
fore=$(tput setaf 0)
none=$(tput sgr0)
PS1='\[$back$fore\]hello\[$none\]$ '
Run Code Online (Sandbox Code Playgroud)

编辑:

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

PS1='\[hello ^?^?^?^?^?^?\]$ '
Run Code Online (Sandbox Code Playgroud)

要容纳各种宽度的文本:

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

使用变量可能会破坏您解析元数据的目的,但为了完整性,我将其包含在内:

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

或者

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

编辑2:

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

PS1='This shows$(: This is hidden)$ '
Run Code Online (Sandbox Code Playgroud)

编辑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)$ 
Run Code Online (Sandbox Code Playgroud)

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