Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >shell脚本对编码和行尾符敏感吗

shell脚本对编码和行尾符敏感吗

作者头像
程序熵
发布于 2023-09-25 03:00:00
发布于 2023-09-25 03:00:00
26700
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:0
代码可运行

问:

我正在macOS上制作一个NW.js应用程序,并想通过双击图标在开发模式下运行该应用程序。在第一步中,我试图使我的shell脚本正常工作。

Windows上使用VS Code,我在项目的根目录下创建了一个run-nw文件,包含以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

cd "src"
npm install

cd ..
./tools/nwjs-sdk-v0.17.3-osx-x64/nwjs.app/Contents/MacOS/nwjs "src" &

但是我得到了这个输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sh ./run-nw

: command not found  
: No such file or directory  
: command not found  
: No such file or directory  

Usage: npm <command>

where <command> is one of:  (snip commands list)

(snip npm help)

npm@3.10.3 /usr/local/lib/node_modules/npm  
: command not found  
: No such file or directory  
: command not found

有些事情我不明白。

  • 它似乎将空行作为命令。在我的编辑器(VS Code)中,我尝试将\r\n替换为\n(以防\r产生问题),但它没有改变什么。
  • 它似乎没有找到文件夹(有或没有dirname指令),或者可能它不知道cd命令?
  • 它似乎不理解npm的install参数。
  • 真正让我感到奇怪的是,它仍然运行应用程序(如果我手动执行npm install)……

由于无法正常工作,并且怀疑文件本身有什么奇怪的地方,我直接在Mac上创建了一个新的文件,这次使用了vim。我输入了完全相同的指令,然后...现在它工作起来没有任何问题。

用 diff 对比两个文件的差异显示完全没有差异。

有什么区别?是什么导致第一个脚本无法运行?我怎样才能知道?

答:

是的。Bash脚本对行结束很敏感,无论是在脚本本身还是在它处理的数据中。它们应该有Unix风格的行结束符,即每行以换行符结束(ASCII中的十进制10,十六进制0A)。

对于Windows或DOS风格的行尾,每一行都以回车符和换行符结束。你可以在命令cat -v yourfile的输出中看到这个不可见的字符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat -v yourfile
#!/bin/bash^M
^M
cd "src"^M
npm install^M
^M
cd ..^M
./tools/nwjs-sdk-v0.17.3-osx-x64/nwjs.app/Contents/MacOS/nwjs "src" &^M

在这种情况下,回车(插入符号中的^M或C转义符号中的\r)不会被视为空白。Bash将shebang之后的第一行(由一个回车字符组成)解释为要运行的命令/程序的名称。

  • 因为没有名为^M的命令,所以它输出: command not found
  • 因为没有名为"src"^M(或src^M)的目录,所以它输出: no such file or directory
  • 它将install^M而不是install作为参数传递给npm,这会导致npm报错。

解决方案

解决方案是将文件转换为使用Unix风格的行结尾(将回车符删除)。有很多方法可以做到这一点:

1. 最简单的方法是使用 dos2unix 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dos2unix filename

2. 使用 sed 命令处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed -i 's/\r$//g' filename
#or
sed 's/\r$//g' filename > newfile

3. 使用 vim 处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#vi filename
:set fileformat=unix 
:w 

4. 使用 tr 命令删除回车符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat filename |tr -d '\r' > newfile

参考:

  • stackoverflow question 39527571
  • man sed

相关阅读:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-15 22:28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux下MySQL shell脚本执行错误 $’\r’:command not found
前几天编写的shell小脚本,测试自动安装MySQL的,今天测试运行,然后出现如下错误
星哥玩云
2022/08/17
2.1K0
Linux下MySQL shell脚本执行错误 $’\r’:command not found
解决dos2unix/unix2dos报错,并在家目录下生成u2dtmp*文件问题
最近接到一个 case:大数据分析那边反馈我们这边推送的数据同比去年同期少了很多。这是很不正常的,因为业务一直在增长。 于是,我开始顺藤摸瓜的跟进。一开始就发现一个小问题:scp 推送文件脚本执行后居
张戈
2018/03/21
3K0
解决dos2unix/unix2dos报错,并在家目录下生成u2dtmp*文件问题
如何编写一个shell脚本
本文结合大量实例阐述如何编写一个shell脚本。  为什么要进行shell编程  在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。  下面,让我们一起来看看shell是如何工作的:  建立一个脚本  Linux中有好多中不同的shell,但是通常我们使用bash (bou
阳光岛主
2019/02/20
1.8K0
高效的Shell编程建议及入坑
描述:在进行shell脚本语言编写的时候,不仅要注意写的功能,更要注意他的美观以及通用性,还需要让其他参与运维的人都能看懂;
全栈工程师修炼指南
2022/09/28
9370
高效的Shell编程建议及入坑
shell 脚本自动配置 gitea git 仓库
eisc
2024/11/13
1590
Linux 常用命令(五)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
小徐
2018/09/21
2K0
Linux 常用命令(五)
一次写shell脚本的经历记录
redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要重启。所以把redis集群的状态检查放到了健康检查中,依赖statefulset的原生能力(pod实例ready后才重启下一个,ready后endpoints controller将pod信息更新到endpoints资源对象中),而没有在redis operator中写逻辑去判断。
我的小碗汤
2019/07/30
9810
shell脚本中出现^M 原
在Windows中编辑的shell脚本,传到linux系统中,在末尾发现出现了很多^M字符
拓荒者
2019/03/11
2K0
shell脚本语言(超全超详细)[通俗易懂]
shell 是一种脚本语言 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译) shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言) shell命令解析器: 系统提供 shell命令解析器: sh ash bash 查看自己linux系统的默认解析:echo $SHELL
全栈程序员站长
2022/09/14
2.8K0
shell脚本语言(超全超详细)[通俗易懂]
一文掌握shell脚本的基本语法
欢迎大家star我的GitHub:https://github.com/SolerHo/geeks-shell,建议直接使用GitHub来查看排版,发现markdown有错位的情况。
阳光罗诺
2022/01/03
4.3K0
一文掌握shell脚本的基本语法
Linux和Windows的换行符
一直对换行符这个东西概念比较模糊,直到最近花了一点时间仔细研究了一下,才彻底搞清楚这个问题,本文前面介绍部分是外文转载,后面例子是个人总结,希望能对大家有一些帮助。 回车符号和换行符号产生背景 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,
三丰SanFeng
2018/01/16
5.6K0
Linux和Windows的换行符
Ubuntu下代替dos2unix命令
Ubuntu系统打开Windows下生成的文本文件,会在每行的末尾出现’^M’ 原因就是Windows和Linux的回车符是不同的
全栈程序员站长
2022/09/15
8960
编写Linux Shell脚本的最佳实践
由于工作需要,最近重新开始拾掇shell脚本。虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看。而且当我在看其他人写的脚本的时候,总觉得难以阅读。毕竟shell脚本这个东西不算是正经的编程语言,他更像是一个工具,用来杂糅不同的程序供我们调用。因此很多人在写的时候也是想到哪里写到哪里,基本上都像是一段超长的main函数,不忍直视。同时,由于历史原因,shell有很多不同的版本,而且也有很多有相同功能的命令需要我们进行取舍,以至于代码的规范很难统一。 考虑到上面的这些原因,我查阅了一些相关的文档,发现这些问题其实很多人都考虑过,而且也形成了一些不错的文章,但是还是有点零散。因此我就在这里把这些文章稍微整理了一下,作为以后我自己写脚本的技术规范。
用户5807183
2019/07/15
1.2K0
编写Linux Shell脚本的最佳实践
Unix\Linux 执行 shell 报错:“$'\r': 未找到命令” 的解决办法
大多数原因是因为 shell 脚本是在 Windows 编写导致的换行问题,具体原因是 Windows 的换行符号为 CRLF(\r\n),而 Unix\Linux 为 LF(\n)。
叨叨软件测试
2021/06/16
4.9K0
Unix\Linux 执行 shell 报错:“$'\r': 未找到命令” 的解决办法
shell 学习笔记(16)
转载请注明出处: https://cloud.tencent.com/developer/user/1177713/activities 注:以前的1-15连载部分放在百度空间, 目前百度空间已不支持
用户1177713
2018/02/24
1.5K0
shell 学习笔记(16)
操作系统 文件换行符问题
首先介绍下,在ASCII中存在这样两个字符CR(编码为13)和 LF(编码为10),在编程中我们一般称其分别为’\r’和’\n’。他们被用来作为换行标志,但在不同系统中换行标志又不一样。下面是不同操作系统采用不同的换行符: Unix和类Unix(如Linux):换行符采用 \n Windows和MS-DOS:换行符采用 \r\n Mac OS X之前的系统:换行符采用 \r Mac OS X:换行符采用 \n Linux中查看换行符 第一种使用"cat -A [Filename]" 查看,如下图所示,看到的为一个Windows形式的换行符,\r对应符号^M,\n对应符号$.
韩旭051
2021/05/11
2.4K0
操作系统 文件换行符问题
实用的 bash 自定义脚本,快速提效工作流程
“关注  前端开发社区 ,回复“ 1” 即可加入  前端技术交流群,回复  “ 2” 即可免费领取500G前端干货
前端老道
2020/11/05
8430
实用的 bash 自定义脚本,快速提效工作流程
使用 dos2unix 解决跨操作系统换行符问题
dos2unix 是将 Windows 格式文件转换为 Unix/Linux 格式的实用命令。
宋天伦
2023/10/21
6850
使用 dos2unix 解决跨操作系统换行符问题
shell脚本编写手册(2021重编)
{ #!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shell shopt # 显示和设置shell中的行为选项 sh -x # 执行过程 sh -n # 检查语法 set -
IT运维技术圈
2022/06/26
3.5K0
Shell脚本之常用Linux命令使用介绍
描述:xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
全栈工程师修炼指南
2022/09/28
1.4K0
Shell脚本之常用Linux命令使用介绍
相关推荐
Linux下MySQL shell脚本执行错误 $’\r’:command not found
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验