我有一个名为“Ø”的文件,我很困惑

我有一个名为“Ø”的文件,我很困惑

我发现了一个¬在旧版 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它变成两个字节xC2xAC(十六进制),或和
的等效八进制值。\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 组成c2ac上面使用 bash 的$'...'功能以十六进制形式输入这些字节。

在支持 unicode 的终端中,这不是必需的:可以简单地使用rm ¬.仅当不支持 unicode 时才需要此解决方法。

文档

Bash 的$'...'功能(在 2.0 中添加,复制自 ksh93,在zshmksh和 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 zshor ksh93or mkshor FreeBSD sh) 的更新版本,并假设当前语言环境使用 UTF-8 字符集,您还可以执行以下操作:

rm $'\u00AC'

答案3

通过使用单引号,您可以避免所有类型的 shell 扩展,并且一切都按原样进行。例如rm '¬'应该删除该文件。

答案4

怎么样

rm -i * 

在文件所在的目录中?

相关内容