我发现了一个¬
在旧版 Solaris 服务器上调用的文件,但我对如何在命令行 (bash 2.05) 上与它交互感到困惑。
Ø 在命令行上与该home
键具有相同的功能。当我按下它时,它将光标移动到行的开头。因此,如果我尝试通过键入来删除它,rm ¬
我最终只会得到rm
.
我创建了一个用 vim 调用的文件file
,并且能够插入 Ø 字符。问题是,每个程序对这个角色的看法都不同。一些例子:
bash-2.05# cat file
¬
bash-2.05# vim file
¬
bash-2.05# vi file
\302\254
bash-2.05# less x
"x" may be a binary file. See it anyway?
<C2><AC>
bash-2.05# more file
¬
bash-2.05# ls
¬
bash-2.05# ls -q
??
bash-2.05# ls -b
\302\254
我能够通过运行删除该文件rm $(cat file)
。但我的问题是,如何通过在命令行中键入它来删除它?rm \302\254
不起作用,我不知道如何处理less
给出的十六进制表示。
有没有特殊的方法可以在命令行中插入 Ø ?
我意识到这可能很难复制,因为它太旧了,但我想我还是会问。
谢谢,帕特里克
答案1
字符¬
是 UNICODE代码点U+00AC
或 172(十进制)。
当用 表示时,utf8
它变成两个字节xC2
和xAC
(十六进制),或和
的等效八进制值。\302
\254
这就是为什么你可以在 bash 中以多种方式打印这样的字符:
$ printf '\302\254' # Add a \n to add a new line.
¬
$ printf '\xC2\xAC'
¬
$ echo -e '\0302\0254' # Bash echo is special for requiring -e.
¬
$ echo -e '\xC2\xAC'
¬
$ echo $'\302\254'
¬
$ echo $'\xC2\xAC'
¬
或者甚至直接使用 UNICODE 值(仅当您的控制台已正确设置为使用 utf8 并且自 [2011 年 2 月 27 日] Bash 版本 4.2 以来,不适用于 bash 2.05):
$ echo $'\u00AC'
¬
$ echo $'\U000000AC'
¬
上述任何方法都适用命令替换
将字符作为参数传递给命令rm
:
$ rm "$(printf '\xC2\xAC')"
如果您的控制台已正确设置。您可以使用-然后使用 home 键
将字符¬
打印在屏幕上。CTRLV
Unix 交互式终端使用 Control-V 表示“下一个字符应该按字面意思处理”(这里的助记符是“v 代表逐字”)
rmspaceCTRLvhome# what you type.
rm ←# what you get.
当然,如果你可以copy and paste
用鼠标选择要使用的字符:
left-click just before the character
move the mouse one character to the right
release the mouse left-click
然后按ctrlinsert进行复制。您可能需要右键单击(将出现一个选择窗口)并选择copy
。
然后将光标移动到要插入字符的位置
并按下shiftinsert进行粘贴。
使用最后一种方法,您实际上可以编写命令:
$ rm ¬
答案2
使用:
rm $'\xc2\xac'
UTF-8 编码中的unicode 字符¬
由 bytes 组成c2
,ac
上面使用 bash 的$'...'
功能以十六进制形式输入这些字节。
在支持 unicode 的终端中,这不是必需的:可以简单地使用rm ¬
.仅当不支持 unicode 时才需要此解决方法。
文档
Bash 的$'...'
功能(在 2.0 中添加,复制自 ksh93,在zsh
、mksh
和 FreeBSD中也可用sh
)相当强大。从man bash
:
$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:
\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits) \cx a control-x character
我们仅使用\xHH
格式(在 2.02 中添加)来输入十六进制字节。
\uHHHH
复制的那个仅zsh
在 4.2 中添加,因此对您不起作用,但对于bash
(or zsh
or ksh93
or mksh
or FreeBSD sh
) 的更新版本,并假设当前语言环境使用 UTF-8 字符集,您还可以执行以下操作:
rm $'\u00AC'
答案3
通过使用单引号,您可以避免所有类型的 shell 扩展,并且一切都按原样进行。例如rm '¬'
应该删除该文件。
答案4
怎么样
rm -i *
在文件所在的目录中?