有没有办法在 Bash 提示 ( $PS1
) 中隐藏一些信息,例如使用 ANSI 转义序列的“不可见颜色”之类的东西。
方法应该是通用的。它不应使用某些罕见终端类型的特殊隐身功能。隐藏的数据也应该隐藏在例如纯 Linux 控制台 ( $TERM == linux
) 中。
将前景色和背景色设置为相同:
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
技术可以正常工作。
归档时间: |
|
查看次数: |
1581 次 |
最近记录: |