给网站做游戏视频怎么赚钱,wordpress 硬件要求,wordpress 个人网站,专业外贸网站建设_诚信_青岛问题
我正在 macOS 上制作一个 NW.js 应用程序#xff0c;并想通过双击图标在开发模式下运行该应用程序。在第一步中#xff0c;我试图使我的 shell 脚本正常工作。
在 Windows 上使用 VS Code#xff0c;我在项目的根目录下创建了一个 run-nw 文件#xff0c;包含以下内…问题
我正在 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 commandwhere command is one of: (snip commands list)(snip npm help)npm3.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 fileformatunix
:w 使用 tr 命令删除回车符
cat filename | tr -d \r newfile参考
stackoverflow question 39527571man sed 相关阅读
在shell程序里如何从文件中获取第n行用Bash变量进行sed替换如何用命令行将文本每两行合并为一行如何使用bash脚本并行运行多个程序为什么要使用xargs命令xargs命令用法实例