前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本对编码和行尾符敏感吗

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

作者头像
程序熵
发布2023-09-25 11:00:00
1620
发布2023-09-25 11:00:00
举报
文章被收录于专栏:技术汇

问:

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

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

代码语言:javascript
复制
#!/bin/bash

cd "src"
npm install

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

但是我得到了这个输出:

代码语言:javascript
复制
$ 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
复制
$ 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
复制
dos2unix filename

2. 使用 sed 命令处理

代码语言:javascript
复制
sed -i 's/\r$//g' filename
#or
sed 's/\r$//g' filename > newfile

3. 使用 vim 处理

代码语言:javascript
复制
#vi filename
:set fileformat=unix 
:w 

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

代码语言:javascript
复制
cat filename |tr -d '\r' > newfile

参考:

  • stackoverflow question 39527571
  • man sed

相关阅读:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档