Shell 插入符号和ANSI转义序列之间的差异
我的问题是从两个不同的观察中提出的 在Shell 插入符号和ANSI转义序列之间的差异,shell,terminal,colors,Shell,Terminal,Colors,我的问题是从两个不同的观察中提出的 在cat中,当我按下ESC或其他控制键时,Bash使用插入符号表示它们。图中显示我按下了ESC键,但Bash显示为^[ 然而,如果我想在脚本中编写彩色文本,例如通过echo,我似乎必须使用ANSI转义序列 该图显示插入符号在echo中不起作用,但ANSI转义序列起作用 我可以说我们必须使用ANSI转义序列来输入ESC键,但是Bash将使用插入符号来表示它吗 有没有一种方法可以通过插入符号输入ESC键?Bash可以表示ANSI转义序列中输入的键吗 请注意,我
cat
中,当我按下ESC
或其他控制键时,Bash使用插入符号表示它们。图中显示我按下了ESC键,但Bash显示为^[
然而,如果我想在脚本中编写彩色文本,例如通过echo
,我似乎必须使用ANSI转义序列
该图显示插入符号在echo
中不起作用,但ANSI转义序列起作用
我可以说我们必须使用ANSI转义序列来输入ESC键,但是Bash将使用插入符号来表示它吗
有没有一种方法可以通过插入符号输入ESC键?Bash可以表示ANSI转义序列中输入的键吗
请注意,我实际上使用的是ZSH。您可以讨论任何一个shell
我可以说我们必须使用ANSI转义序列来输入ESC键吗
不,使用特殊键盘或配置,您可以像输入任何其他字符一样从键盘输入\033
字节
,但是Bash将使用插入符号来表示它
我相信Bash没有使用插入符号。终端在执行程序时显示未损坏的ESC字符时显示为^[
。您可以执行sleep 20
并按ESC键,结果相同。您可以在不使用Bash的情况下执行终端窗口,并使用sleep 20
,它还将打印^[
按ESC键时
有没有办法用插入符号输入ESC键
我不知道有什么程序能做到这一点,但编写一个简短的脚本将插入符号转换为字节只需几分钟的工作
我可以说我们必须使用ANSI转义序列来输入ESC键吗
不,使用特殊键盘或配置,您可以像输入任何其他字符一样从键盘输入\033
字节
,但是Bash将使用插入符号来表示它
我相信Bash没有使用插入符号。终端在执行程序时显示未损坏的ESC字符时显示为^[
。您可以执行sleep 20
并按ESC键,结果相同。您可以在不使用Bash的情况下执行终端窗口,并使用sleep 20
,它还将打印^[
按ESC键时
有没有办法用插入符号输入ESC键
我不知道有什么程序能做到这一点,但编写一个简短的脚本将插入符号转换为字节只需要几分钟的工作
$echo'CTRL+VESC[31mhello'
完成后,它会显示给你
$ echo '^[[31mhello'
在bash中可能需要set-ovi
但是,最好的方法是使用tput
:
$ tput setaf 9; echo hello; tput sgr0
如果你打字
$echo'CTRL+VESC[31mhello'
完成后,它会显示给你
$ echo '^[[31mhello'
在bash中可能需要set-ovi
但是,最好的方法是使用tput
:
$ tput setaf 9; echo hello; tput sgr0
请不要发布文本图片…@KamilCuk我认为我无法在SO上用彩色书写文本。@GQnbig:我建议您删除zsh或bash标记,一次只关注一个shell。请不要发布文本图片…@KamilCuk我认为我无法在SO上用彩色书写文本。@GQnbig:我建议您删除其中任何一个他使用zsh或bash标记,一次只关注一个shell。感谢您回答我的每个问题。似乎我可以得出结论,将ESC输入bash/Linux/terminal的最后一步是使用ANSI转义序列。您的
sed
示例转换为^[发送到ANSI,然后发送到Bash,除非您显示一个shell或一个直接使用插入符号的著名程序,否则您的sed会将ANSI转换为插入符号。也许我不理解基本概念。“符号”是指表示事物,而“转义”是指输入吗?因此要求Bash/Terminal/Linux使用“转义”是毫无意义的“表示事物吗?然后发送到Bash
否,它在终端上输出它。Bash只将程序的输出重定向到终端,数据不通过shell,而是按原样显示。您的sed将ANSI转换为插入符号
我不明白,它转换了两个字符^[
转换为字节\x1b
不多不少。表示“符号”的意思是在“转义”时表示事物吗“平均输入?
转义通常是指在字符前面加上另一个字符,以通知读者一个特殊的含义。符号是表示事物的标准方式。27等于0x1b
等于\033
?它是用不同的“符号”表示的完全相同的数字。”,其中\0
和0x
是表示八进制和十六进制数的转义序列。我们人类使用10进制“符号”来表示数字。10进制中的27也等于^[
插入符号。感谢您回答我的每一个问题。似乎我可以得出结论,将ESC输入到bash/Linux/terminal的最后一步是使用ANSI转义序列。您的sed
示例转换为^[发送到ANSI,然后发送到Bash,除非您显示一个shell或一个直接使用插入符号的著名程序,否则您的sed会将ANSI转换为插入符号。也许我不理解基本概念。“符号”是指表示事物,而“转义”是指输入吗?因此要求Bash/Terminal/Linux使用“转义”是毫无意义的“表示事物吗?然后发送到Bash
否,它在终端上输出它。Bash只将程序的输出重定向到终端,数据不通过shell,而是按原样显示。您的sed将ANSI转换为插入符号
我不明白,它转换了两个字符^[
转换为字节\x1b
不多不少。表示“符号”的意思是表示事物,而“转义”表示事物
$ echo '^[[31mhello'
$ tput setaf 9; echo hello; tput sgr0