背景

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

问题

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

#!/bin/bash
while true
doecho "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脚本无法运行相关推荐

  1. 在 Windows 系统上使用 Vim 编写 Shell 脚本并且运行

    1. Windows 下的 PowerShell Shell 既是一种命令语言,也是一种程序设计语言,目前主要用于 Linux 系统. PowerShell 是一种跨平台的任务自动化解决方案,由命令行 ...

  2. linux shell脚本 wget,bash – 在shell脚本中运行wget和其他命令

    以下是编写shell脚本时要使用的一些准则. >使用它们时始终引用变量.这有助于避免误解的可能性. (如果文件名包含空格怎么办?) >不要相信像rm这样的命令上的文件加载.请改用循环. ( ...

  3. Linux中shell编程——编写shell脚本,实现功能:在用户输入年、月后自动打印出对应年月的日

    实验目的 理解shell程序的设计方法 掌握shell程序编辑.运行.调试方法与过程 实验内容 shell简单编程 实验过程 要求: 1.记录实验过程,对关键过程进行文字说明并附上操作截屏. 2.逻辑 ...

  4. 使用 JavaScript 编写 Shell 脚本

    作为程序员,在平时的开发中肯定少不了一些命令行操作了.当然,简单的命令大家都是可以拿捏的,但是涉及到一些逻辑的时候还是比较头疼的. Shell Shell 是一个用 C 语言编写的程序,它是用户使用 ...

  5. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  6. 9.4 Scratch3/www,踩坑,修改chroblocks模块LED输入方式,第五天:修改模块并同步一键云部署(软连接制作,密钥生成,编写shell脚本实现发布,与git pull 分支更新)。

    1.git clone 官网的scratch3.0/www 问题1: python2模块. 方案:需安装到c://Python27下 问题2: 先安装Cocos2d-x模块. https://coco ...

  7. 多宽带联网(三) OpenWrt中使用cURL方法编写Shell脚本自动完成网页宽带认证登录(校园网认证登录解决方案) 使用awk命令

    对于非PPPoE方式认证,而是采用网页认证登录的宽带用户(如校园网).采用<多宽带联网(二)>中的方法一个一个接口进行认证登录过于繁琐.本节将采用Shell脚本和cURL方法,模拟人工认证 ...

  8. 如何使用zx编写shell脚本

    编写Shell脚本的问题 创建一个由Bash或者zsh执行的shell脚本,是自动化重复任务的好方法.Node.js似乎是编写shell脚本的理想选择,因为它为我们提供了许多核心模块,并允许我们导入任 ...

  9. 教你如何编写shell脚本

    一.shell脚本编程规范 在一些复杂的Linux维护工作,大量重复性的输入与交互操作不但费时费力,而且容易出错,而编写一个恰好片的shell脚本程序,可以批量处理.自动化地完成一系列维护任务,大大减 ...

最新文章

  1. 【网络】高性能网络编程--下一个10年,是时候考虑C10M并发问题了
  2. nginx的反向代理以及负载均衡模块的使用
  3. 经典卷积神经网络--LeNet-5的详解
  4. AS查看Android系统源码
  5. 让cocos2dx支持并通过arm64 编译
  6. android Camera 录像时旋转角度
  7. 大数据之-Hadoop完全分布式_集群文件存储路径说明_完全分布式集群测试---大数据之hadoop工作笔记0038
  8. AD中按Y使器件竖直方向上镜像翻转
  9. 【二叉树的迭代版后序遍历】LeetCode 145. Binary Tree Postorder Traversal
  10. Android如何谷歌搜索,android – 如何从谷歌地方检索搜索建议?
  11. PIX防火墙基本特性:失效处理机制和冗余-原理与实验
  12. github客户端教程
  13. Nginx系列 (1)--Nginx安装升级打补丁
  14. 两个字符串的最长公共子串(C++)
  15. 服务窗口关闭了,服务就停止了,真特么烦 pm2了解一下
  16. 《MySQL必知必会》第8篇:存储过程、函数
  17. 3dsMax纸风车建模教程
  18. 2023,本命年向阳而生
  19. Unity WebGL 下载替换Word模板数据
  20. 超低功耗 段码LCD液晶显示驱动IC-VKL060 SSOP24 15SEG*4COM,超低工作电流约7.5微安,多用于传感器/水电表/工控仪表等

热门文章

  1. StrickyAssignor 分配策略
  2. ZkServer服务启动的逻辑-ServerCnxnFactory.createFactory
  3. MapStruct解决数据传输对象转换的繁琐
  4. 用户注册 - 判断用户名存在
  5. byte和bit的关系
  6. Redisson初始化
  7. 服务器端虚拟化安卓,安卓服务器端实例
  8. JAVA编写的7个规范
  9. 共模干扰和差模干扰(图解)---摘自: 硬件十万个为什么
  10. Docker 容器中“TERM environment variable not set.”问题解决