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命令? - 它似乎不理解
npm的install参数。 - 真正让我感到奇怪的是,它仍然运行应用程序(如果我手动执行
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 风格的行结尾(将回车符删除)。有很多方法可以做到这一点:
- 最简单的方法是使用
dos2unix命令
dos2unix filename
- 使用
sed命令处理
sed -i 's/\r$//g' filename
#or
sed 's/\r$//g' filename > newfile
- 使用
vim处理
#vi filename
:set fileformat=unix
:w
- 使用
tr命令删除回车符
cat filename | tr -d '\r' > newfile
参考
- stackoverflow question 39527571
- man sed
相关阅读:
- 在shell程序里如何从文件中获取第n行
- 用Bash变量进行sed替换
- 如何用命令行将文本每两行合并为一行?
- 如何使用bash脚本并行运行多个程序
- 为什么要使用xargs命令
- xargs命令用法实例
相关文章:
shell脚本对编码和行尾符敏感吗
问题 我正在 macOS 上制作一个 NW.js 应用程序,并想通过双击图标在开发模式下运行该应用程序。在第一步中,我试图使我的 shell 脚本正常工作。 在 Windows 上使用 VS Code,我在项目的根目录下创建了一个 run-nw 文件,包含以下内…...
神经网络----现有网络的下载和使用(vgg16)
以下两种方法已经用不了 vgg16_false torchvision.models.vgg16(pretrainedFalse) vgg16_true torchvision.models.vgg16(pretrainedTrue) 改为 vgg16_model0 vgg16(weightsNone) #vgg16_false vgg16_model1 vgg16(weightsVGG16_Weights.DEFAULT) # pretrained vgg16_…...
Java 异常处理 - 自定义异常
在Java中,自定义异常是一种创建新异常类的方式,这些异常类继承自Throwable类或其子类Exception(或RuntimeException,如果它是运行时异常的话)。自定义异常通常用于描述特定于应用程序的错误情况,以便为调用…...
Excel 交叉表的格转成列,行转成格
Excel里交叉表的左表头是卡车号,上表头是工作,交叉格是工作编号。 ABCD1Truck NumberJob1Job2Job3271592859285928372395859282971473297159282971 要求:将交叉格转为列,左表头转为格。 ABC1297139585928272727137371473715726…...
【C++软件调试技术】什么是pdb文件?如何使用pdb文件?哪些工具需要使用pdb文件?
目录 1、什么是pdb文件? 2、如何配置生成pdb文件? 3、pdb文件的时间戳和文件名称 3.1、pdb文件的时间戳 3.2、pdb文件的文件名称 4、有pdb文件才能在Visual Studio中调试代码 5、在Windbg中使用pdb文件 5.1、使用lm命令查看二进制文件的时间戳,去查找对应版本的pdb文…...
如何搭建一台永久运行的个人服务器?
一、前言 由于本人在这段时候,看到了一个叫做树莓派的东东,初步了解之后觉得很有意思,于是想把整个过程记录下来。 二、树莓派是什么? Raspberry Pi(中文名为树莓派,简写为RPi,(或者RasPi / RPI) 是为学习计算机编程…...
Ant Design+react 表单只读
表单禁用,样式不好看,不符合甲方标准,看了一下文档,select、radio等都不支持只读状态。 解决方法: 利用css3的point-events属性,设置为none 在查看弹窗时,传入一个变量,当变量为true…...
推荐系统三十六式学习笔记:原理篇.近邻推荐07|人以群分,你是什么人就看到什么世界
目录 协同过滤基于用户的协同过滤背后的思想原理实践1、构造矩阵2、相似度计算3、推荐计算4、一些改进 应用场景:总结 谈及推荐系统,不得不说大名鼎鼎的协同过滤。协同过滤的重点在于协同,所谓协同,也就是群体互帮互助,…...
要改进单例模式的实现以确保线程安全并优化性能,有几种常见的方法
要改进单例模式的实现以确保线程安全并优化性能,有几种常见的方法。以下是几种改进 ThreadUtil 单例实现的方法: ### 1. 懒汉式(线程安全版) 使用同步机制来确保线程安全,但只在第一次创建实例时同步,这样…...
k8s——Pod容器中的存储方式及PV、PVC
一、Pod容器中的存储方式 需要存储方式前提:容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。 首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态&…...
Java/Golang:活用interface,增加程序扩展性
场景 在paas中间件众多的场景下,做一款用于巡检多个paas组件健康状态的工具。工具的编写需要具备一定的扩展性,便于后续新增某个paas组件巡检的功能。 管理多个paas组件,需要方便扩展新增。 思路 使用面向对象编程思想,首先对…...
SQL语句练习每日5题(四)
题目1——查找GPA最高值 想要知道复旦大学学生gpa最高值是多少,请你取出相应数据 题解: 1、使用MAX select MAX(gpa) FROM user_profile WHERE university 复旦大学 2、使用降序排序组合limit select gpa FROM user_profile WHERE university 复…...
Java排序算法汇总篇,八种排序算法
排序算法汇总: Java排序算法(一):冒泡排序 Java排序算法(二):选择排序 Java排序算法(三):插入排序 Java排序算法(四):快速排序 Java排序算法(五):归并排序 Java排序算法(六):希尔排序 Java排序算法(…...
R语言探索与分析20-北京市气温预测分析
一、序言 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。气象温度的预测一直以来都是天气预…...
2024年安全现状报告
2024 年安全现状报告有些矛盾。尽管安全专业人员的道路困难重重,比如说严格的合规要求、不断升级的地缘政治紧张局势和更复杂的威胁环境,但整个行业还是在取得进展。 许多组织表示,与前几年相比,网络安全变得更容易管理。组织之间…...
OV通配符ssl证书是什么
通配符https证书的产品比较丰富,为了方便区分,可以按照验证方式将通配符https证书分为DV基础型通配符https证书和OV企业型通配符https证书两种。其中OV通配符https证书申请条件高,审核也比较严格,相比于DV基础型通配符https证书&a…...
Selenium三种等待方式的使用!
UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1、有frame;2、没有设置等待。 因为代码运行速度和浏览器…...
websockets怎么工作的呢?
WebSockets是一种在单个TCP连接上进行全双工通信的协议,使得客户端和服务器之间的数据交换变得更加简单,并允许服务端主动向客户端推送数据。下面是WebSockets的工作原理: 1. **握手阶段**: - 客户端发起一个HTTP请求到服务器&…...
栈 数组和链表实现
stack 栈 LIFO后进先出 应用 实现递归 编辑器的撤回工作(按下ctrl z) 数组实现 // 列表的插入和删除从一端实现 那么就得到了栈 // array和linked lists//stack-Array based implementation #include<stdio.h> #include<stdlib.h> #def…...
如何备份和恢复华为手机?
智能手机已成为我们日常生活中不可或缺的一部分,它们存储着大量敏感数据。因此,确保数据安全,定期备份至关重要,以防手机意外丢失、损坏或被盗。 如果您拥有华为设备,并且正在寻找如何将华为手机备份到PC的方法&#…...
文脉定序系统处理多语言语义排序实战:跨语言检索效果展示
文脉定序系统处理多语言语义排序实战:跨语言检索效果展示 你有没有遇到过这样的烦恼?想找一份关于“机器学习”的日文资料,却只能用中文关键词去搜,结果要么搜不到,要么搜出来的东西完全不对路。或者,你手…...
Python数据可视化实战:用matplotlib绘制专业级折线图(附完整代码)
Python数据可视化实战:用matplotlib绘制专业级折线图(附完整代码) 数据可视化是现代数据分析不可或缺的一环,而折线图作为最基础也最常用的图表类型之一,能够直观展示数据随时间或有序类别的变化趋势。对于Python开发者…...
GAMES201实战:5分钟搞懂快速多极展开(FMM)在静电模拟中的应用
GAMES201实战:5分钟搞懂快速多极展开(FMM)在静电模拟中的应用 当你在游戏引擎中设计一个带电粒子系统时,是否遇到过这样的困境:随着粒子数量增加,计算速度呈指数级下降?传统N体问题计算需要处理每个粒子间的相互作用&a…...
FlowState Lab新手避坑指南:快速上手时间序列预测的5个技巧
FlowState Lab新手避坑指南:快速上手时间序列预测的5个技巧 1. 环境准备与快速部署 1.1 系统要求与安装步骤 FlowState Lab作为基于IBM Granite架构的时间序列分析工具,对运行环境有以下要求: 操作系统:Linux (推荐Ubuntu 20.…...
ROS2实战:从rclpy到rcl,手把手拆解一个Publisher的完整创建流程(附代码)
ROS2深度解析:从Python接口到C层实现的Publisher全链路拆解 在机器人操作系统ROS2的架构中,理解从高级语言接口到底层实现的完整调用链路是开发者进阶的必经之路。本文将聚焦一个核心场景:创建一个Publisher对象时,从Python层的r…...
ViVe完整贡献指南:从入门到精通的开源参与秘籍
ViVe完整贡献指南:从入门到精通的开源参与秘籍 【免费下载链接】ViVe C# library and console app for using new feature control APIs available in Windows 10 version 2004 and newer 项目地址: https://gitcode.com/gh_mirrors/vi/ViVe ViVe是一个C#库&…...
CBoard自研多维引擎揭秘:轻量级架构如何撬动大数据分析
CBoard自研多维引擎揭秘:轻量级架构如何撬动大数据分析 【免费下载链接】CBoard CBoard - 这是一个基于 Node.js 的开源面板,用于管理 Kubernetes 集群和应用程序。适用于 Kubernetes 集群管理、容器编排、持续集成等场景。 项目地址: https://gitcode…...
智能文献处理:茉莉花插件如何实现中文文献管理的自动化革命
智能文献处理:茉莉花插件如何实现中文文献管理的自动化革命 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在学术研究…...
Dify工作流集成StructBERT:构建自定义文本智能处理应用
Dify工作流集成StructBERT:构建自定义文本智能处理应用 最近在做一个智能客服系统的升级项目,客户那边提了个挺实际的需求:每天有大量工单进来,希望系统能先自动判断一下问题类型,比如是“账号问题”、“支付故障”还…...
一键部署MedGemma:打造个人医学AI研究环境
一键部署MedGemma:打造个人医学AI研究环境 1. 为什么需要医学AI研究环境 在医学影像分析领域,研究人员常常面临两个主要挑战:一是缺乏高效的工具来快速验证新的AI模型在医学影像上的表现,二是需要一个直观的界面来展示和解释AI的…...
