RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1259520
Accepted
Venot
Venot
Asked:2022-03-23 08:59:37 +0000 UTC2022-03-23 08:59:37 +0000 UTC 2022-03-23 08:59:37 +0000 UTC

为什么看似相同的文件不能在 linux 上运行?

  • 772

我有两个几乎相同的脚本test.sh,并且updated_pack.sh在 Linux 上。两者都包含字符串:sudo apt-get upgrade -y >> /var/log/update_script.log.

该脚本test.sh重 54 个字节(根据ls -l)并正常运行。反过来,该脚本update_script.sh重 55 个字节并且没有启动,从而给出错误:

Permission deniedin 1: /var/log/updated_script.log

两个文件具有相同的权限,包括运行权限。

执行后hexdump发现两个文件几乎一样,除了最后两个字节。最后那几个角色是什么?

截屏:

在此处输入图像描述

linux
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Anton Menshov
    2022-03-23T11:28:44Z2022-03-23T11:28:44Z

    这是关于换行符的。并且很可能从 Windows 复制并粘贴到 Linux。


    如果文件test.sh是通过 Linux 上的“在某些文本编辑器中键入字符”创建的(无复制/粘贴),并且严格包含:

    sudo apt-get upgrade -y >> /var/log/update_script.log
    

    那么我们有

    > hexdump test.sh 
    0000000 7573 6f64 6120 7470 672d 7465 7520 6770
    0000010 6172 6564 2d20 2079 3e3e 2f20 6176 2f72
    0000020 6f6c 2f67 7075 6164 6574 735f 7263 7069
    0000030 2e74 6f6c 0a67 
    

    它对应于您成功运行的文件。

    现在来点魔法。我们取上面的文件test.sh并将其中现有的Unix 字符LF(Line Feed) 换行符更改\n为CR(Carriage Return) \r:

    > cat test.sh | tr -s '\n' '\r' > update_pack.sh
    > hexdump update_pack.sh 
    0000000 7573 6f64 6120 7470 672d 7465 7520 6770
    0000010 6172 6564 2d20 2079 3e3e 2f20 6176 2f72
    0000020 6f6c 2f67 7075 6164 6574 735f 7263 7069
    0000030 2e74 6f6c 0d67 
    

    我们看到最后一个代码 已0a67更改为0d67,这就是您在屏幕截图中实际拥有的内容。

    现在让我们弄清楚它是什么000a。LF嗯...这就是(Line Feed)的 Unicode 字符。

    现在我们开始了解大致发生了什么:该序列CRLF用于 Windows 中的换行符。这意味着在某些时候,以无与伦比的形式从一个来源复制到另一个来源,甚至使用 Unicode,这一切都落在了粉丝身上。幸运的是风扇是标准化的,只是不会启动。

    脚本对这些东西很敏感,行应该以LF. 理由:

    POSIX 3.206:

    3.206线

    零个或多个非字符加上一个终止字符的序列。

    POSIX 3.243

    3.243 换行符()

    输出流中的一个字符表示打印应该从下一行的开头开始。它是C语言中'\n'指定的字符。未指定此字符是否是系统传输到输出设备以完成移动到下一行的确切序列。

    解决方案:使 Linux shell 脚本中的换行符正确:\n.

    另一个有用的读物​​:

    • \n 和 \r 之间的区别
    • 什么是十六进制的 CRLF
    • 7

相关问题

  • 如果 fuser -k number/tcp 没有帮助,如何在 Debian 中释放端口?

  • Ubuntu。startx 不起作用。黑屏

  • --syn 在 iptables 中有什么作用?

  • 为什么需要iso格式?

  • C程序中没有密码的sudo

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5