V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Canglin
V2EX  ›  程序员

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

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

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

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

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

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

    总之要看情况。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如果自己练手,可以写,但永远不要上线。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1302 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.