PyCharm编写shell脚本无法运行

Posted 周先森爱吃素

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyCharm编写shell脚本无法运行相关的知识,希望对你有一定的参考价值。

背景

我们常常选择使用PyCharm在本地(Windows)进行开发,然后将文件远程同步到远程服务器(Linux)运行程序,但是这样编写的shell脚本常常无法运行,出现语法错误,因为好几个朋友和我提到了这个问题,所以这里本文介绍该问题的原因和解决方法。

问题

首先,我们在本地IDE(PyCharm)中创建项目并配置Linux服务器的文件远程同步(见教程),然后编写一个test_win.sh文件并在其中写入如下的测试代码,然后通过右击Deployment将其上传到远程服务器,这部分远程同步的操作见我之前的教程

#!/bin/bash
while true
do
  echo "hello"
done

然后我们使用ssh工具登录远程服务器跑这个shell脚本,但是此时却出现了下图的错误,意思很简单,我们的语法有误,但是这么简单的一段脚本我们可以确认看起来没有什么问题。


那么问题究竟是因为什么呢?其实,PyCharm对换行符默认的设置是依赖系统的,但是实际上Windows系统的换行符是\\r\\n而Linux系统的换行符是\\n,这就造成我们Windows上写的文件同步到远程服务器无法运行。

解决方案

知道了问题的原因,自然就有了解决的方案,首先,关于换行符的设置在PyCharm的File->Settings->Editor->Code Style配置中,下图是默认配置,可以看到红色的2处Line separator是依赖于系统的,也就是依赖我们当前安装PyCharm的所在的Windows系统因此是\\r\\n符号。

而且,1处此可采用的是Default配置也就是IDE配置,我们首先将其切换为Project模式,这个模式的意思是为每个项目单独设置Code Style配置且这个设置会覆盖IDE的设置,如果不切换为这个模式,本项目由于开启了下面的Enable EditorConfig support会依然按照默认的Project模式的配置,等于我们的修改是无效的,而且由于我们有各种各样的项目,也不建议修改Default模式的配置。下面的所有解决方案都需要先切换为Project模式。

对于shell脚本无法运行,下面提供两种解决方案,针对不同的情况:

  1. 若该项目只在远程Linux服务器中运行,如深度学习训练项目,那么将上图的Line separator修改为"Unix and macOS (\\r)"即可然后点击Apply然后点击OK即可配置成功,此时对于新文件就会采用这个配置了。注意,是新文件,因为编辑器没有权限修改已有脚本中的内容,会存在风险。 因此,现在我们新建一个test_linux.sh的文件,写入和上面那个脚本一样的内容,此时可以发现已经如下图一样变成了LF,这个表示\\n,这就是Linux系统需要的。

    然后我们将这个文件同步到远程并运行,可以看到,运行成功。

  2. 若该项目也需要在其他平台运行,我不想改变其他类型的文件的换行符,那么我们只需要单独对shell脚本类型的文件进行配置即可(因为其他文件明显可以正常运行,没有影响)。我们和上面一样将Code Style的配置切换为Project模式后展开Code Style菜单栏找到下图所示的Shell Script并勾选2处所示的为Shell脚本采用\\n换行符。

    此时我们同上新建文件发现右下角其实还是Windows的CRLF(对应\\r\\n),但是当我们远程同步之后,这里就变成了LF表示自动转换成功,这个脚本Linux也是可以运行的,和上面方法1的效果一致。

以上是关于PyCharm编写shell脚本无法运行的主要内容,如果未能解决你的问题,请参考以下文章

notepad编写的脚本在shell下无法运行

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

如何在 pycharm 中调试包含可执行命令的 shell 脚本文件?

pycharm编写脚本区域右键没有执行按钮怎么处理?我已经设置了解析器!

编写shell脚本运行python文件

pycharm怎么运行python脚本