• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Canglin
V2EX  ›  程序员

可不可以把 shell 脚本替换为 Python 脚本?

  •  
  •   Canglin · Jul 31, 2024 · 14286 views
    This topic created in 829 days ago, the information mentioned may be changed or developed.
    目前公司生产上大概有 1000+的 shell 脚本,最近总能刷到 Python 替换 shell 的言论,不知道可不可行,目前我也不清楚 Python 照 Shell 来说有什么优势,之前做过一个临时工单,抽取 3000+文本文件中的特定条件的字符串到指定文件中,Shell 执行了 14 小时左右 Python 执行了大概 20 分钟,不知道可不可以作为参考依据
    本人运维
    100 replies  •  2024-08-07 11:42:34 +08:00
    somebody1
    somebody1
    Jul 31, 2024❤️18
    1
    凭你的描述和对问题探究的深度,不动是最好的
    baobao1270
    baobao1270
    Jul 31, 2024 via Android❤️3
    2
    首先建议公司用的话能动就别换
    Python 的问题是,你不知道系统带的 Python 是什么版本,然后系统自带 Python 装包会污染系统的 python 环境
    外部交互比较麻烦,以前一行搞定的事情现在要 subprocess
    但是复杂的脚本用 Python 优势就很明显了,而且因为转义遇到的 bug 也少
    skyrim61
    skyrim61
    Jul 31, 2024
    3
    发出来看看, 不然大伙不知道, 注意规避敏感信息
    lazyyz
    lazyyz
    Jul 31, 2024 via Android
    4
    生产不动一般不会出问题!
    业务既然能接受 14 小时,为什么要变呢?
    catsoul
    catsoul
    Jul 31, 2024❤️18
    5
    能用就别动

    这种事情等着上级驱动,你做了才是完成本职工作

    如果你自己擅自改了,做好了算是正常(无功无过),但凡一个脚本做出问题,导致哪怕一丁点生产事故,这锅你就牢牢焊死在背上吧,主动离职谢罪
    baobao1270
    baobao1270
    Jul 31, 2024 via Android❤️1
    6
    抽取 3000+文本文件中的特定条件的字符串到指定文件中,这个肯定是 python 很方便,用 shell 其实每一行都会新建进程,开销很大,python 是进程内部处理了
    想要学习的话以后遇到新的这种纯文本转换/提取的任务,如果要写新的脚本的话,可以用纯 python 写,记得不要调外部包,加 type hinting
    fsdrw08
    fsdrw08
    Jul 31, 2024 via Android❤️2
    7
    不建议换,理由同 2 楼
    即便真要换,也该换成 Ansible+Ansible runner
    Canglin
    Canglin
    OP
    Jul 31, 2024
    8
    @somebody1 #1 是的,我就是个二把刀,只是想磨练自己的技术🤣
    Canglin
    Canglin
    OP
    Jul 31, 2024
    9
    @baobao1270 #2 是这样的,我就是个二把刀,平安县翻译的水平,我想请教一下什么样的脚本就可以算是复杂脚本了
    Canglin
    Canglin
    OP
    Jul 31, 2024
    10
    @skyrim61 #3 这个不太方便,不好意思
    Canglin
    Canglin
    OP
    Jul 31, 2024
    11
    @lazyyz #4 不是,是临时工单,他们对这个也没有要求,我只是想举个例子,看看是不是所有的 shell 脚本都是比 Python 脚本效率低
    Canglin
    Canglin
    OP
    Jul 31, 2024
    12
    @catsoul #5 那我学习技术的机会是不是没有了
    ho121
    ho121
    Jul 31, 2024 via Android
    13
    Shell 执行了 14 小时左右 Python 执行了大概 20 分钟

    这个要看写法,实现相同功能,有的写法效率高,有的写法效率低。有的用 shell 实现方便,有的 python 实现方便。

    比如字符串流式处理,文件操作多一些的,一般 shell 容易实现。但如果有 url 调用,post put 之类的数据还比较复杂还要有自动重试之类的,或者有复杂正则的,python 更方便一些。

    总之要看情况。

    还有环境依赖的 shell 和 python 其实差不多。
    shell 下同一个工具比如 grep 来说,不同系统下可能是不同的版本,功能可能有些许差别。
    python 更是了,首先是 python 版本就很难统一。然后是第三方包的版本也很难统一,总不能一个简单的脚本还要自带 virtualenv 吧。

    另外一个是 debug ,这个个人感觉 python 脚本 debug 更方便一些。这应该是各巨大优势。
    jorneyr
    jorneyr
    Jul 31, 2024
    14
    不听建议,只听命令。
    Canglin
    Canglin
    OP
    Jul 31, 2024
    15
    @baobao1270 #6 之前的 Shell 脚本是我们的乙方写的,我本人不会写 Shell ,只会一点 Python ,之前的 Python 也确实没有用三方包
    yinmin
    yinmin
    Jul 31, 2024 via iPhone❤️3
    16
    遵循准则第一条:能用就别动。

    sh 的很多指令都是一个可执行文件,跑 sh 脚本时会重复加载运行进程,有大量循环处理会慢一些。python 的库比较完善,如果开发新脚本可以考虑用 python 。

    op 是运维,应该编程不是强项,但是懂一点编程,推荐目前地表最强 ai claude 3.5 sonnet ,500 行以下的程序绝对是编程高手中的高手。不同语言的转换也是一流的,你把 sh 给 ai 直接转成 python 。有一个技巧:提问前先打草稿,梳理需求分析很重要。你用了 claude 3.5 ,复杂脚本就不需要程序员打配合了。

    claude 官网封号比较厉害,google cloud 可以申请 claude api 加一个壳就能用。也可以用二道贩子的平台。
    Canglin
    Canglin
    OP
    Jul 31, 2024
    17
    @ho121 #13 业务场景主要是数仓的 ETL 过程,看了几个实践案例,Shell 与 Python 的都有,我个人还是比较倾向于 Python 的
    luckyc
    luckyc
    Jul 31, 2024
    18
    当然可以, 只要你愿意.
    yinmin
    yinmin
    Jul 31, 2024 via iPhone
    19
    python 用到第三方库,一定要建虚拟环境.env ,不同的程序用各自的虚拟环境。

    网上搜索到的第三方库的使用代码,一定要上 pypi.org 看看是不是真开源,有多少人 star ,可不可靠。因为任何人都可以往 pip 里上传自己的库,要小心供应链攻击。
    doublebu
    doublebu
    Jul 31, 2024
    20
    可能 PowerShell 也是一个不错的选择?毕竟可以用 dotnet 生态
    loading
    loading
    Jul 31, 2024
    21
    如果你是运维,我建议是用 golang ,没有上面环境等问题。

    但还是那句话,能用还是别动。
    salmon5
    salmon5
    Jul 31, 2024
    22
    建议换成 go ,或者 rust
    crackidz
    crackidz
    Jul 31, 2024
    23
    可行但没必要
    Canglin
    Canglin
    OP
    Jul 31, 2024
    24
    @salmon5 #22 舍本逐末了
    gimp
    gimp
    Jul 31, 2024❤️1
    25
    @Canglin #12 学习为什么要用生产环境练手...
    noahlias
    noahlias
    Jul 31, 2024
    26
    什么 shell 脚本这么抽象要执行 14 个小时
    shell 本身不就是调各种命令吗 严重怀疑 shell 脚本写的有问题
    codingKingKong
    codingKingKong
    Jul 31, 2024❤️1
    27
    可以换, 前提是你能有可靠的测试手段和测试方案.
    属于受累不讨好的工作量. 如果确实决定了, 那么请考虑以下三个方面:
    1.调研清楚为什么要 A shell 脚本要这么写, 是否有业务限制?
    2.从小到大, 从易到繁, 不要上来就去动最麻烦的那个, 不确定的不要动.
    3.测试, 保证你修改后不能产生问题和引入新的问题, 其中比较麻烦的点在于边界处理. 例如, 某段 shell 代码隐含的处理逻辑会产生 a 数据结果, 替换为 python 后没有这样的效果, 导致预期行为改变.
    剩下的, 就是慢慢的改, 建议每动一批之后, 留一些时间观察, 防止测试不到的事故集中爆发, 让你处理不过来.
    祝好.
    sakeven
    sakeven
    Jul 31, 2024
    28
    如果是大规模机器上使用 python ,python 的环境问题远比 shell 要复杂,要换也是建议换成 go 、rust 之类的。
    libook
    libook
    Jul 31, 2024 via Android
    29
    shell 主要用于调用其他指令处理的情况,Python/Perl 等主要用于对数据进行处理的情况,你可以混合使用,甚至必要情况下可以自己写 Go/Rust 程序来处理计算密集型或资源匮乏情况下的任务。
    zictos
    zictos
    Jul 31, 2024 via Android
    30
    python 肯定可以替代 shell 啊,写起来方便很多很多,不过已经写好的 shell 就暂时没必要换了。
    重点体现在实现同样需求的代码量和简洁度,不过如果要优化速度,python 优化起来也会方便很多。执行外部命令用 subprocess 可能稍微麻烦点,代码行数可能多点,除非还是用 os.system 和 os.popen
    guanzhangzhang
    guanzhangzhang
    Jul 31, 2024
    31
    要看实现手段,之前腾讯有个论坛出了个奖金题目,处理一个 nginx 日志里 ip 信息,有用 perl 的,有用 python 的,有用 shell 的,最后第一名用时最短,大佬用了好多 shell 和 linux 黑科技
    sleepyfevniv
    sleepyfevniv
    Jul 31, 2024
    32
    这不一个降本增效、提升自己存在感的机会来了嘛?先不动就不动,然后打报告,说要用 Python 优化 xx 个慢 shell ,提高性能 xx%,然后写进 OKR 里面。慢 SQL 改起来费劲,但是这个应该会好很多吧。带上 GPT 写起来更加方便,就是优化的话,可不能把原来的正常的搞崩了。
    codersdp1
    codersdp1
    Jul 31, 2024
    33
    @sleepybear1113 可能一个不小心就是增笑了。
    ckloy
    ckloy
    Jul 31, 2024
    34
    强烈建议先 review 下 Shell 脚本
    Emiya1208
    Emiya1208
    Jul 31, 2024
    35
    有些东西不怎么需要性能,shell 脚本搁在那不出意外能兼容当前 +- 10 年的发行版,python 脚本放在这儿,Python 3.9 写出来的东西不一定能在 Python 3.6 上 run 起来。

    我经常在某些特定的环境写 python 运维脚本,写的不怎么优雅,这不是能力问题,因为很多时候我必须被环境缚手缚脚(完全只使用 python 标准库来写脚本)
    wu67
    wu67
    Jul 31, 2024❤️1
    36
    生产尽量不动. bash 能跑就不 zsh, shell 能用就不 py. 等到负责人受不了了再搞, 炸了也有人一起扛雷
    naythefirst01
    naythefirst01
    Jul 31, 2024
    37
    生产环境先稳定再高效 如果不是十分有把握 最好不要自己找锅背
    Emiya1208
    Emiya1208
    Jul 31, 2024
    38
    补充一下 即便是 go 或是 rust ,也可能在某些特定的残疾环境上运行出现问题。所以,某些场景下,perl 甚至还有用武之地,虽然这东西我看不懂。
    AAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAA
    Jul 31, 2024
    39
    生产环境怎么统一管理的,可以统一的话可以试,需要先立项,比如能给你领导或者领导的领导写一页 PPT 那种,提高了多少效率之类的,然后从上往下执行。
    baobao1270
    baobao1270
    Jul 31, 2024
    40
    @Canglin 还是看个人感觉吧,比如你这个替换 3000+文本个人认为算复杂的。还有大量文本模板填充之类,配置文件生成,不是简单的 grep / awk 就能处理的日志分析之类的。
    Canglin
    Canglin
    OP
    Jul 31, 2024
    41
    @baobao1270 #40 你想复杂了,就是很简单的抽一行字符串然后写到新的文件中
    Canglin
    Canglin
    OP
    Jul 31, 2024
    42
    @wu67 #36 看来是有经验的
    langhuishan
    langhuishan
    Jul 31, 2024
    43
    能动就别换,让我想起了切尔诺贝利
    vialon17
    vialon17
    Jul 31, 2024
    44
    可以试试 lua
    4BVL25L90W260T9U
    4BVL25L90W260T9U
    Jul 31, 2024
    45
    重构、换语言本质上是公司内部的政治运动。你考虑下是不是你这个级别能推得动的吧。
    Canglin
    Canglin
    OP
    Jul 31, 2024
    46
    @ospider #45 感觉一下子就说到重点了
    wws2023
    wws2023
    Jul 31, 2024
    47
    @catsoul 这个实在,弄好了白费时间,没银子拿 ,弄不好饭碗今天就得丢
    meeop
    meeop
    Jul 31, 2024
    48
    做了公司有奖励就干,做了没奖励就不干
    Adonis142857
    Adonis142857
    Jul 31, 2024
    49
    能用就别动
    tingyunsay
    tingyunsay
    Jul 31, 2024
    50
    又不是不能用.jpg
    mark2025
    mark2025
    Jul 31, 2024
    51
    替代 shell 脚本可以考虑 TypeScript:安装 nodejs ,和 tsx ,用 tsx 直接执行 ts 脚本,即实现 js 灵活也能有类型保护。
    enihcam
    enihcam
    Jul 31, 2024
    52
    “Shell 执行了 14 小时左右”

    是一天执行一次,还是一年执行一次?你倒是说啊!

    一天执行一次?
    先写 Python 和测试用例——》 Shell 和 Python 双跑一个月——》迁移( Shell 做 fallback 方案一年)+ 向上汇报拿奖金。

    一年执行一次?
    洗洗睡吧。
    artiga033
    artiga033
    Jul 31, 2024 via Android❤️1
    53
    非要说替换 shell ,我觉得也是 ruby/perl 优先于 python
    duzhuo
    duzhuo
    Jul 31, 2024
    54
    不同 python 版本都不一定兼容 还是蒜了吧
    Puteulanus
    Puteulanus
    Jul 31, 2024
    55
    我也觉得不如用 golang ,速度可能更快,没有环境问题,而且你管理的服务器跑着一堆二进制程序完全是黑盒,防裁员利器(狗头
    oudemen
    oudemen
    Jul 31, 2024
    56
    james122333
    james122333
    Jul 31, 2024 via Android
    57
    这应该是写不好 首先 shell 并不是每行新建进程
    全使用内建命令效能还可以 写到 14 小时有点多 但效能还是会低于 python 因为 shell 是每行解释执行的 本身就不适合处理数据 需要效能可直接调用外部专门处理数据的工具(如三剑客)并将其一并处理不建立额外进程 当然怎么做依照经验 shell 本身强在注重状态 可以容易写流程与调用
    lolizeppelin
    lolizeppelin
    Jul 31, 2024
    59
    @baobao1270
    笑死还 type hinting...

    你猜猜大量用的系统是啥版本....
    包含上千个脚本的公司你猜猜用啥系统...
    搞不好一堆 init.d
    lolizeppelin
    lolizeppelin
    Jul 31, 2024
    60
    @artiga033
    ....你听说过 perl 的笑话么.....
    还用 perl 笑死..perl 要是靠谱根本没 python 在系统里的立足之地

    ruby 还 tm 有人用么现在..瞎出主意,楼上居然还有说用 lua 的..

    要么 shell 要么 python 要么 golang
    lolizeppelin
    lolizeppelin
    Jul 31, 2024
    61
    楼主你也不要想着全换...把脚本和模块一样分类..看看那些是系统无关的..哪些纯字符串处理的

    确定好功能后,影响小的、适合换其他语言的就换,不适合的就不换,别想着全干掉

    脚本.sh 后缀没意义的,里面直接是个 python 或者直接是二进制文件都可以

    完全可以做到不改脚本名替换代码
    vvhy
    vvhy
    Jul 31, 2024❤️1
    62
    唉,看到前排真的很感慨,知道大家说得有道理,但是很难接受
    SimonOne
    SimonOne
    Jul 31, 2024
    63
    首先 import os🙈
    Heo
    Heo
    Jul 31, 2024
    64
    新写的用 python ,以前写的维持 shell
    akin520
    akin520
    Jul 31, 2024
    65
    能用不动
    jim9606
    jim9606
    Jul 31, 2024 via Android
    66
    如果能保证只使用 python3 不兼容 2,并且忍住不用任何第三方库,还是不错的。
    建议只迁移数据处理的部分,例如 http 收发,修改 json,数值计算之类的,通过 argparse 将参数暴露给流程控制的 sh
    poporange
    poporange
    Jul 31, 2024
    67
    公司的脚本,就别乱动了吧,万一你一个没改好,不纯纯自己给自己找事儿。
    Canglin
    Canglin
    OP
    Jul 31, 2024
    68
    @enihcam #52 临时工单,就那么一次,妹有频率,我就是举个例子,并不是针对这一个单子
    tomemi
    tomemi
    Jul 31, 2024
    69
    python 环境坑太多
    yougg
    yougg
    Jul 31, 2024
    70
    1000+Shell 脚本 是为了应对多少不同的环境和复杂场景才积累出来的数量? 你是怎么想象出来随便就能用胶水语言搞定这些环境和场景的?做一个合格的运维就老老实实拿起《高级 Bash 脚本编程指南》啃透了然后直接去解决你提到的性能问题,少在哪折腾胶水在不同版本的存在的一堆兼容性问题。
    ytmsdy
    ytmsdy
    Jul 31, 2024
    71
    1000+的 shell 脚本,这也算是搞复杂性项目了,没事别乱动,搞炸了搞不好你就能直接 N+1 了。
    这么多的定时任务,公司其实是需要从系统级别来搞了
    McreeWu
    McreeWu
    Jul 31, 2024
    72
    @lolizeppelin #60 赞同,简单的用 shell ,复杂点的用 python ,有能力用 golang 。
    dddd1919
    dddd1919
    Jul 31, 2024
    73
    立新不破旧
    wanniwa
    wanniwa
    Jul 31, 2024
    74
    你可以以后新加的脚本换成 python ,以前的都不动
    forQ
    forQ
    Jul 31, 2024
    75
    既然不会写 shell ,只会一点 python ,那就什么都别动
    windsound
    windsound
    Jul 31, 2024
    76
    @Canglin #12 你这咋想的,学习一定要用生产的东西玩吗?
    shyangs
    shyangs
    Jul 31, 2024❤️2
    77
    不會 Shell 你是改寫不了舊的 shell script 為 python 的, 別搞出生產事故了.
    VYSE
    VYSE
    Jul 31, 2024
    78
    替换 sh, python 不加-u 肯定要被坑
    XDiLa
    XDiLa
    Jul 31, 2024❤️1
    79
    @somebody1
    崩不住了 看到你说的这句话
    yufeng0681
    yufeng0681
    Jul 31, 2024
    80
    @lolizeppelin #61 做事情有调理,点赞!
    题主已经有想法了,评论家们都一边倒的不建议动, 他们是安全第一。
    题主要想晋升,就必须在常规工作外有亮点的绩效,这个一千个脚本就是意外工作可能的亮点。
    1 、 先把 1000 个脚本分类, 把非系统运营用的脚本筛出来, 写 ppt 告诉领导隐患,改进办法,你的实际改造效果(其中 1~2 个案例),由领导拍板后续思路。
    2 、基于这些个非系统运营脚本,对你们公司业务进行抽象,看看能不能找到更好的集成工具,对这一类需求能搞个类似低码平台的方式,轻轻松松做出来,开发成本,运行效率,维护成本等方面都能极大改善 [这是另外一个 ppt] , 这个做出来或者汇报出来,估计就能成为你下一阶段的专项工作,也能获得卓越绩效
    levelworm
    levelworm
    Jul 31, 2024 via Android
    81
    复杂的脚本可以试试看。
    iorilu
    iorilu
    Jul 31, 2024
    82
    14 小时?

    脚本写的有问题把, 脚本也是调用一些工具 awk 之类的, 这些工具本身并不慢
    my3157
    my3157
    Jul 31, 2024
    83
    个人经验, 一般避免 shell 脚本超过 60 行, 时间长了累计大量的 shell 脚本维护起来太困难了
    qaq44566
    qaq44566
    Jul 31, 2024
    84
    最近尝试用 lua 替代 shell ,目前已经能实现一个进程中 lua 调用 shell 的函数,shell 调用 lua 的函数,不过还需要一些工作

    (不是推荐群主换,我自己有个 3000 行的脚本想重构

    [https://github.com/qaqland/dotlua]( https://github.com/qaqland/dotlua)
    mylovesaber
    mylovesaber
    Jul 31, 2024
    85
    楼主可否详细点介绍下 [抽取 3000+文本文件中的特定条件的字符串到指定文件中] 的情况?有点好奇想测试下效果,有 demo 吗? shell 理论上没这么慢吧,各种文件中都有多少内容啊?
    qzydustin
    qzydustin
    Jul 31, 2024
    86
    个人项目就换了,公司项目...emmm...有什么必要嘛。
    lanlanye
    lanlanye
    Aug 1, 2024
    87
    系统里本来就有很多不同的脚本,除了 shell 的一般至少还会有一些 Perl 和 Python 的,偶尔还有一些 Lua 和 Ruby 的。
    我倾向于在系统预装的里面选一个自己比较熟练的。
    mayli
    mayli
    Aug 1, 2024
    88
    除非有明显优势,或者你就是纯想学习,否则没必要。
    vsheyan
    vsheyan
    Aug 1, 2024
    89
    @catsoul 而且根据以往的经验不出事情的概率微乎其微,这 3000 行的 shell 里面处理特殊情况的代码至少就得几百行
    Tink
    Tink
    Aug 1, 2024
    90
    什么项目需要用到 1000+shell 脚本。。
    javak
    javak
    Aug 1, 2024
    91
    想见识一下 python 怎么把 shell 14 小时的功能优化到 20 分钟的。op 可以把敏感信息砍掉
    shaozelin030405
    shaozelin030405
    Aug 1, 2024
    92
    1. 可以
    2. 自己学自己写
    3. 别动生产,到时候出了问题别睡觉了
    jackmod
    jackmod
    Aug 1, 2024
    93
    没事别在大规模系统上用 python 。你自己锁版本了,不代表依赖的包会锁,也不代表依赖的依赖会不会严格遵循版本号。
    给自己和自己的小组写的工具无所谓用什么。
    enihcam
    enihcam
    Aug 1, 2024
    94
    @Canglin 那你管它干什么?
    aloxaf
    aloxaf
    Aug 1, 2024
    95
    1000+ shell 脚本,你敢动这坨屎山?……

    还有 3000+ 文本文件的字符串提取怎么会这么慢,你们难道每个字符串 x 每个文件都 grep 一次?
    vx7298
    vx7298
    Aug 1, 2024
    96
    就这点数量,还不够塞牙缝,以前就不说了,现在我已经把所有脚本统一用 gpt 转换为 golang 了,简直不要太爽了,shell 脚本的一个主要问题是,轻易不写,写的时候,查半天,熟练了,然后又停很久,全忘完,蛋疼,只有运维才天天写这玩意
    jenson47
    jenson47
    Aug 1, 2024
    97
    第一:从工作量来看,这个需要很多时间,建议不要个人操刀,要上面下任务再去弄,不然费时费力,出事还背锅。
    第二:一般情况下,如果对项目不熟,能跑就别动,而且你的脚本还不少。如果硬是要搞,最起码先调查下各个系统情况,比如 python 版本
    第三:失败补偿方案要跟上,此外如何边开发边验证,还有就是 python 扩展包管理 [方便机器移植]
    james122333
    james122333
    Aug 2, 2024 via Android
    98
    @vx7298

    也不用天天写 专门研究即可
    我ㄧ开发都写
    novaline
    novaline
    Aug 2, 2024
    99
    既然问的这么宽泛,答案很简单:Yes, you can
    magine
    magine
    Aug 7, 2024
    100
    第一个问题:给你钱吗?不给钱不要承担责任。

    如果自己练手,可以写,但永远不要上线。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1735 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 306ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    ♥ Do have faith in what you're doing.