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

问题

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

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

#!/bin/bashcd "src"
npm installcd ..
./tools/nwjs-sdk-v0.17.3-osx-x64/nwjs.app/Contents/MacOS/nwjs "src" &

但是我得到了这个输出:

$ 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 命令?
  • 它似乎不理解 npminstall 参数。
  • 真正让我感到奇怪的是,它仍然运行应用程序(如果我手动执行 npm install)……

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

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

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


回答

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

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

$ 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 命令
dos2unix filename
  1. 使用 sed 命令处理
sed -i 's/\r$//g' filename
#or
sed 's/\r$//g' filename > newfile
  1. 使用 vim 处理
#vi filename
:set fileformat=unix 
:w 
  1. 使用 tr 命令删除回车符
cat filename | tr -d '\r' > newfile

参考

  • stackoverflow question 39527571
  • man sed

相关阅读:

  • 在shell程序里如何从文件中获取第n行
  • 用Bash变量进行sed替换
  • 如何用命令行将文本每两行合并为一行?
  • 如何使用bash脚本并行运行多个程序
  • 为什么要使用xargs命令
  • xargs命令用法实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细分析Mysql临时变量的基本知识(附Demo)

目录 前言1. 用户变量2. 会话变量 前言 临时变量主要分为用户变量和会话变量 1. 用户变量 用户变量是特定于会话的&#xff0c;在单个会话内可以在多个语句中共享 以 符号开头在 SQL 语句中使用 SET 语句或直接在查询中赋值 声明和赋值 SET var_name value; -- 或者 SE…

深耕低代码,技术赋能企业转型业务

随着信息化时代的飞速发展&#xff0c;企业对于数字化转型的需求日益迫切。在这个背景下&#xff0c;低代码技术应运而生&#xff0c;为企业提供了一种更加高效、灵活的业务解决方案。本文将围绕“深耕低代码&#xff0c;技术赋能企业转型业务”这一主题&#xff0c;深入探讨低…

构建Vue3项目的几种方式,如何简化setup写法

1、说明 在vue2版本中&#xff0c;我们使用vue-cli脚手架进行构建&#xff0c;而切换到Vue3之后&#xff0c;依然可以使用vue-cli脚手架进行构建&#xff0c;但是官方推荐使用vite工具进行构建&#xff0c;下面将介绍几种方式构建vue3项目。 2、使用vue-cli脚手架构建Vue3项目…

使用Service Worker、Web Workers进行地图渲染优化

地图的渲染涉及到大量的dom&#xff0c; 如果每次地图重渲染都操作dom将会照成很大的性能开销&#xff0c;下面总结两个方案来开发和优化离线地图&#xff0c;以提升地图操作的流畅性和性能&#xff1a; 方案一&#xff1a;使用Service Worker和离线缓存 利用Service Worker技…

180. 连续出现的数字

180. 连续出现的数字 题目链接&#xff1a;180. 连续出现的数字 代码如下&#xff1a; # Write your MySQL query statement below select distinct l1.num as ConsecutiveNums fromLogs as l1,Logs as l2,Logs as l3 wherel1.idl2.id-1and l2.idl3.id-1and l1.numl2.numand …

【前端面试高频手写题】

# 面试高频手写题 建议优先掌握&#xff1a; instanceof - 考察对原型链的理解 new - 对创建对象实例过程的理解 call/apply/bind - 对this指向的理解 手写promise - 对异步的理解手写原生ajax - 对ajax原理和http请求方式的理解&#xff0c;重点是get和post请求的实现 # 1…

15、数据资产评估指导意见

第一章 总则 第一条 为规范数据资产评估行为,保护资产评估当事人合法权益和公共利益,根据《资产评估基本准则》及其他相关资产评估准则,制定本指导意见。 第二条 本指导意见所称数据资产,是指特定主体合法拥有或者控制的, 能进行货币计量的,且能带来直接或者间接经济利…

在vue项目中实现单点登录

核心依赖版本&#xff0c;vue3.4.x&#xff0c;vue-router4.3.x。 由于vue项目一般都是前后端分离的&#xff0c;所以这里单点的跳转需要在vue中处理。 一开始考虑将单点跳转做在后端&#xff0c;但那样感觉又将前后端强耦合了起来&#xff0c;所以最终还是决定将单点认证的跳转…

excel的XLOOKUP的快速多列关联查询

我们前几章上面介绍了&#xff0c;根据某国产品牌官网介绍的使用&连接来进行多列关联查询&#xff0c;非常的慢。有没有公式可以快速进行XLOOKUP多列关联查询&#xff0c;我们找到了一个速度还可以的办法。 原理&#xff1a;有几列需要关联查询&#xff0c;我们就写几个XLO…

高考填报志愿,怎么分析自己适合什么专业?

高考结束后&#xff0c;很多考生不知道自己的分数段适合什么学校&#xff0c;缺乏目标感&#xff0c;有些专业名称很大&#xff0c;听起来光鲜亮丽&#xff0c;但是是否适合自己&#xff0c;学什么课程&#xff0c;将来就业去向&#xff0c;这些都是需要细致了解的。 专业选择…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

提高篇(八):扩展Processing功能:从库使用到跨平台应用

提高篇(八):扩展Processing功能:从库使用到跨平台应用 引言 Processing是一款强大的创意编程工具,广泛应用于艺术、设计和教育等领域。但其真正的魅力在于其可扩展性:你可以通过使用各种扩展库、结合其他编程语言、在不同硬件平台上应用,甚至创建自己的扩展库来丰富Pro…

第十九章 SOAP 错误处理

文章目录 第十九章 SOAP 错误处理Web 服务中的默认故障处理在 Web 服务中返回自定义 SOAP 错误 第十九章 SOAP 错误处理 本主题介绍如何处理 Web 服务和 Web 客户端内的故障。 请注意&#xff0c;SOAPPREFIX 参数会影响任何 SOAP 错误中使用的前缀&#xff1b;请参阅指定 SOA…

Python SQLAlchemy库详解

大家好&#xff0c;在Python生态系统中&#xff0c;SQLAlchemy库是一个强大的工具&#xff0c;为开发人员提供了便捷的方式来处理与数据库的交互。无论是开发一个小型的Web应用程序&#xff0c;还是构建一个大型的企业级系统&#xff0c;SQLAlchemy都能满足你的需求&#xff0c…

什么是shell脚本?

简介 Shell脚本&#xff0c;又称Shell命令稿、程序化脚本&#xff0c;是一种电脑程序使用的文本文件&#xff0c;内容由一连串的shell命令组成&#xff0c;经由Unix Shell直译其内容后运作。Shell脚本可以用来自动化操作&#xff0c;简化管理任务&#xff0c;提高工作效率。 …

事件驱动和动画

目录 表盘交互逻辑 24点纸牌游戏事件驱动 动画 图形动画 属性动画 帧动画 总结 表盘交互逻辑 1.定时器的使用 2.线程中如何更新UI 代码: public static void main(String[] args) {Application.launch();}public void start(Stage stage) {Timer timer = new Timer(…

从零手写实现 nginx-10-sendfile 零拷贝 zero-copy

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

【操作与配置】MySQL安装及启动

【操作与配置】MySQL安装及启动 下载MySQL 进入官网&#xff0c;选择社区版下载 在windows安装 选择不登陆下载 安装MySQL 双击官方安装包 选择“Developer Default”&#xff08;默认&#xff09;即可 Execute&#xff0c;安装完成后next TCP/IP端口等&#xff0c;默认即可…

vue3中作用域插槽

1、先说一下具名插槽 有时在一个组件中包含多个插槽出口是很有用的。举例来说&#xff0c;在一个 组件中&#xff0c;有如下模板&#xff1a; <div class"container"><header><!-- 标题内容放这里 --></header><main><!-- 主要内容…

【TS】进阶

一、类型别名 类型别名用来给一个类型起个新名字。 type s string; let str: s "123";type NameResolver () > string;: // 定义了一个类型别名NameResolver&#xff0c;它是一个函数类型。这个函数没有参数&#xff0c;返回值类型为string。这意味着任何被…