小编mga*_*ort的帖子

为什么 ^M 和 \r 表现不一致?

也许已经有一些答案可以间接回答我的问题,但我已经阅读了很多,但尚未找到对这种差异的满意答案。

回车的本义来自老式电传打字机:它的意思是将打印头在当前行中向左移动。如果您继续在当前行写入,您将覆盖已经写入的内容。如今,我们可以使用文本符号来指定这种行为\r,它是在字符串中明确输入的。例如,在 Python 中您可以执行print('hello\rgoodbye'),而在终端中您可以执行echo $'hello\rgoodbye',并且在这两种情况下您都只会看到goodbye.

相比之下,伪回车也可以与 ASCII 控制字符^M(用Ctrl-M或键入Enter)交互插入。我称它为伪回车是因为尽管它被广泛称为回车\r,但令人惊讶的是它没有 insert ,而是 inserts \n,这是换行的符号。

因此,交互式键入hello, then Ctrl-M, thengoodbye出人意料地没有达到 的等价物hello\rgoodbye,而是相当于hello\ngoodbye.

这不是很矛盾吗?这背后的原理是什么?

terminal-emulator terminal history ascii control-characters

12
推荐指数
1
解决办法
972
查看次数

打开和创建文件时 Bash 扩展不对称

我在 Bash 正则表达式中遇到了以下不对称示例,这让我感到困惑。我想知道我在做什么是非标准的并导致这种行为,否则我所缺少的这种行为背后的逻辑是什么。

打开文件

假设我有一个名为文件列表的目录file1.txtfile20.txt。我想在我最喜欢的文本编辑器中打开所有这些。为此,从某种意义上说,Bash 必须“读取”目录的内容并将它们传递给 Vim。我可以使用以下正则表达式来做到这一点:

vim file{[1-9],1[0-9],20}.txt
Run Code Online (Sandbox Code Playgroud)

这有效。执行此命令后,Vim会打开,并在缓冲区列表里,我可以看到所有的文件file1.txtfile20.txt

创建文件

现在假设我们处于不同的场景:我们从一个空目录开始,我们想要将文件创建file1.txtfile20.txt. 为此,从某种意义上说,Bash 必须将文件名“写入”到目录中。不幸的是,在这种情况下,前面的命令不起作用。我没有创建所需的 20 个文件,而是在缓冲区列表中得到以下文件:

file[1-9].txt
file[0-9].txt
file20.txt
Run Code Online (Sandbox Code Playgroud)

因此[],与其将方括号解释为正则表达式的一部分,不如将它们合并到名称中。

为什么在阅读与写作时会发生这种不对称,我将来如何避免这种情况?

bash wildcards brace-expansion files

6
推荐指数
1
解决办法
382
查看次数

使用 shopt -s autocd 有什么注意事项吗?

我最近发现了这个功能shopt -s autocd

          autocd  If  set,  a command name that is the name
                  of a directory is executed as if it  were
                  the argument to the cd command.  This op?
                  tion is only used by interactive shells.
Run Code Online (Sandbox Code Playgroud)

乍一看似乎很有帮助,但我不是 Bash 专家,我想知道使用它是否可能是错误的。

设置是否有任何潜在危险shopt -s autocd?我对脚本编写以及与其他应用程序或配置的冲突特别感兴趣。

bash cd-command shell-script shell-builtin shopt

3
推荐指数
1
解决办法
147
查看次数