【问题标题】:Bash command producing different results if typed in to terminal instead of copy and pasted如果在终端中输入而不是复制和粘贴,Bash 命令会产生不同的结果
【发布时间】:2020-04-21 12:35:57
【问题描述】:

Linux 新手,通过 VirtualBox 在运行 Ubuntu 的 VM 上练习 bash。 有一个命令可以打印文本文件中每一行的第一个字符,从而产生正确的输出:

cut -f 1- -d "^M" sample.txt | cut -c 1

但是,当我从终端复制命令并使用 Ctrl+Shift+c 和 Crtl+Shift+v 粘贴回终端然后执行时,它给了我以下错误:

cut: the delimiter must be a single character

编辑:我通过按住 Ctrl+v 并按回车键输入“^M”

编辑:没有意识到 Cut 命令在每一行都运行,所以给出的示例中命令的第一部分是无用的,即使问题仍然有效。

【问题讨论】:

  • 你确定没有前导是尾随空格还是换行符?
  • 删除cut -f 1- -d "^M"。只是cut -c1 sample.txt。如果"^M" 真的是一个回车符,那么cut -f 1- -d "^M" 是一种删除dos 行结尾的有趣方式。
  • 如何输入"^M"?您是键入^ 后跟M 还是按CTRL+M?请在您的问题中回答这个问题。
  • 绝对没有前导尾随空格或换行符,我认为 Bodo 是在正确的轨道上,当我输入 ^M 而不是 Crtl+v+CarriageReturn 我得到同样的错误,如果有人能阐明为什么发生这种情况然后我会接受答案

标签: linux bash terminal ubuntu-18.04 cut


【解决方案1】:

我知道在 Linux 中您在屏幕上输入 ctrlv 后跟 Enter 得到 ^M 的唯一情况是在文本内编辑器 vimgvim

在这种情况下,您文件中输入的文本实际上是一个回车符,但在屏幕上,您会看到两个字符 ^M。由于你看到的不是你得到的,复制和粘贴它会导致不可预测的结果。

在 Linux 中,行不是由回车符(十六进制代码 0dctrlm)分隔,而是由换行符(十六进制代码 0actrlj).

【讨论】:

  • 我实际上在 ubuntu 上使用默认终端,即 GNOME,但无论如何我认为你的解释仍然适用
【解决方案2】:

您可以尝试使用dos2unix 命令,而不是使用 bash 脚本替换 Windows 文件中的 ^M,这正是该命令的作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2021-12-29
    • 2016-11-17
    • 2016-01-19
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多