【发布时间】:2021-09-09 19:30:21
【问题描述】:
我正在 Mac 上制作 NW.js 应用程序,并希望通过双击图标以开发模式运行该应用程序。第一步,我正在尝试使我的 shell 脚本工作。
在 Windows 上使用 VSCode(我想争取时间),我在项目的根目录下创建了一个 run-nw 文件,其中包含以下内容:
#!/bin/bash
cd "src"
npm install
cd ..
./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
我真的不明白:
- 它似乎将空行作为命令。在我的编辑器 (VSCode) 中,我尝试将
\r\n替换为\n(以防\r产生问题),但它没有任何改变。 - 似乎找不到文件夹(有或没有
dirname指令),或者它不知道cd命令? - 似乎不理解
install对npm的参数 - 真正让我感到奇怪的是,它仍在运行应用程序(如果我手动执行了
npm install)...
无法使其正常工作,并且怀疑文件本身有些奇怪,我直接在 Mac 上创建了一个新文件,这次使用 vim。我输入了完全相同的说明,然后……现在它可以正常工作了。
两个文件的差异显示完全零差异。
有什么区别?什么会使第一个脚本不起作用?我怎样才能知道?
更新
按照接受的答案的建议,在错误的行尾出现后,我检查了多项内容。原来,由于我从我的 Windows 机器上复制了我的~/.gitconfig,所以我有autocrlf=true,所以每次我在 Windows 下修改 bash 文件时,它都会将行尾重新设置为\r\n。
因此,除了运行 dos2unix(您必须在 Mac 上使用 Homebrew 安装)之外,如果您使用的是 Git,请检查您的配置。
【问题讨论】:
-
如果你在 Linux 上运行一个 shell 脚本,至少到目前为止我遇到的所有 shell 实现,如果他们在某个地方发现了一个 \r,就会感到不安。不,你说你已经删除了\r,我希望你证实它们真的消失了。为了安全起见,您应该以十六进制级别查看文件,以确保其中没有其他奇怪的字符。下一步是使用
sh -x ./run-nw执行脚本,以获取更多信息。 -
另一个在文本文件中查找奇怪字符的好命令是
LC_ALL=C cat -vet /path/to/file。如果文件是正常的,它会看起来很正常(除了每行末尾有一个“$”)。任何异常都应该很好地突出。 DOS/Windows 文件的行尾将有“^M$”。 -
你不需要安装
dos2unix;tr命令就足够了,它是标准操作系统安装的一部分。下面的答案之一显示了如何使用它,并且可能值得更多的支持。 -
dd中还有一个功能可以执行此 IIRC,但可以说它太晦涩无法给出答案。 -
tr无法使用 BOM 修复 UTF-8(无论如何这都是可憎的);也许另请参阅stackoverflow.com/a/38038099/4957508 了解背景和stackoverflow.com/questions/45240387/… 了解如何删除它。至少 一些 版本的dos2unix可以解决这个问题,但我猜不是全部。