现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

有了Shell,为什么还需要 Python、Ruby?

2019-09-12 10:03 工业·编程 ⁄ 共 1147字 ⁄ 字号 评论 12 条

作为一名shell(sh/bash)用户和编程语言爱好者,我说说自己的体会吧。

shell作为一门编程语言,和其它编程语言一样,有自己所擅长的问题领域。至少目前来看,还没有哪一门编程语言适合解决所有的问题。正如一个设计原则所说:If it is good for everything, it is good for nothing. 当我们说一门编程语言适合解决某类问题时,我们实际想要表达的是,使用这门语言,可以在最短的时间内获得一个性能,可读性和可维护性等各方面都可接受的程序。而做到这一点的关键是,这门编程语言必须在这类特定问题上,有前期的经验积累。这些经验会以数据结构或库的形式体现出来。一些激进的语言设计,甚至会将这些经验,以词法糖的方式嵌入到语言中。最终的效果是,使用一门语言解决他所擅长的问题时,只需要借鉴一个现成的思路,在他的基础上进行极少的创新,然后编写很少的代码就可以完成。本质是,当你在使用一门语言解决它所擅长的问题时,你实际是站在了这个语言以前的无数个使用者的经验基础之上

shell这门编程语言,最初设计时就是为了方便系统管理工作所以,他在语法和数据结构上,针对系统管理工作中遇到的常见问题,进行了特殊的优化。例如,系统管理时要运行很多现有的程序,因而shell通过命令查找规则,将内部命令和外部程序融合在了一起,不做区分;再比如,系统管理时经常要将处理结果临时保存,因而shell在语法上支持重定向功能,可以将一个程序的标准输出直接存储到文件中;再比如,系统管理时,一个程序的运行结果往往会作为另一个程序的输入数据,因而shell在语法上支持管道操作;再比如,系统管理时,数据都是以字符串形式表示的,因而shell在语法上支持大量的字符串操作,包括通配、正则表达式等等。所有的这些,达到的最终效果是,使用shell语言编写系统管理的脚本时,好想,好写,好调试,最终的程序短小精悍。个人认为,shell语言的最大魅力还是体现在命令行上。简单,直接,用一行命令,将现有的程序拼接在一起,就可以完成工作。而同样的工作,如果用其它的编程语言,就可能需要几百行。

如果用shell语言来完成其他工作呢?它天生就不是干这个的。用shell语言做数值运算?抱歉,性能不够。用shell语言实现复杂算法?抱歉,除了字符串和简单的数组,没有其它的数据结构了。用shell语言编写大规模的程序?可能Java语言更合适一些。

Perl语言,据Perl作者的介绍,是shell语言的加强版,改进了很多shell语言原有的缺点。个人认为,如果学习shell语言的过程可以比作是捡贝壳的话,那么学习Perl语言的过程就是筛沙子,整个海滩的沙子。

历史是很多偶然因素造就的。语言本身的设计只是它兴盛和衰亡背后的一个因素。

目前有 12 条留言    访客:11 条, 博主:0 条 ,引用: 1 条

  1. 爱求索 2020年11月28日 11:01 上午  @回复  Δ1楼 回复

    因为shell是工具型的东西,工具就是工具,要干工具的事情,工具就是要方便,要简单,要糙快猛,但是不用面面俱到,不用严谨有序,计算浮点数?性能嗷嗷快?内存操作?严谨的逻辑?高级的抽象?…… 统统不需要,它需要的,就是方便地让我搭起架子,让我迅速地发出指令,至于具体的事情,应该让其他程序来做.比如你在shell里export个环境变量,这就是个很容易的事情,那在这个shell里就变成个全局的东西了(谁都能改),这是方便的(工具干的事情),但问题是这个东西可能被其他程序改了,被谁改了你是不知道,这就是个不严谨的东西,那我要实现一个严谨的,带命名空间的,所有环境变量都有命名空间,命名空间有权限,权限需要验证,这就麻烦了,这套东西就是程序该做的事情.我只是举个例子.

  2. 爱求索 2020年11月28日 11:03 上午  @回复  Δ2楼 回复

    在系统维护管理这个领域的编程工作,如果C语言是一,那么shell的位置应该是二,python/ruby/php等等,应该在三这个位置上。嵌入式系统很多采用*nix内核,有多少自带python/ruby运行环境的?但shell可以有,也经常有。POSIX标准专门有对shell编程制定规范,我们可以在/etc/下看到很多系统脚本,第一行指定的解释器都是/bin/sh,这就是最保守、但也最有利于移植的shell脚本写法。

  3. 爱求索 2020年11月28日 11:07 上午  @回复  Δ3楼 回复

    有了python为什么还要shell。 因为python几乎可以做shell所有的事情,而且更方便,更好。
    原因很简单,因为shell更小巧,更适合做批处理。这是linux设计之初就定下来的原则。
    python强大在于它是通用语言。字符串,文件解析,正则表达式等等都要比shell方便。另外它还有强制的扩展功能。不象shell那样需要各种命令工具支持。编程也更优美,可读性也更强。
    python诞生之初就是为了简化运维工作量用的。最后发展成通用语言。
    ruby则不同。它就是通用语言。为了编程乐趣而生的。优雅。 这两种语言只需要学一个就可以了。

  4. 爱求索 2020年11月28日 11:08 上午  @回复  Δ4楼 回复

    shell ruby python等都是脚本语言,之所以选择Python或者ruby是因为这两种语言编写的程序更易读。现在的机器都已经足够快,也就是人比机器贵,所以程序能够让程序员很快的读懂才是最重要的。

  5. 爱求索 2020年11月28日 11:20 上午  @回复  Δ5楼 回复

    所谓“shell”,首先得是操作系统界面(这也是 shell 的原义),其次才是一个编程语言。而操作系统的职能中,文件系统和进程管理是两块很重要的地方。因此 shell 十分强调文件和命令,这是其他脚本语言所不具备的。具体强调的方式,有语义上的,也有语法上的。

    考虑最简单的,用 vim 打开文件 a.c,用 shell 写是:
    vim a.c
    用 Python 的话写出来就得是:
    from subprocess import
    call call([‘vim’, ‘a.c’])
    这里可以看到的几点是,
    1) shell 有意混淆内建函数(builtin function)和外部命令的区别;
    2) shell 对裸词(bareword)的支持,即不加引号的词自动视为字符串;
    3) shell 使用空格分割参数,调用也不需要括号。
    这三点使得 shell 中写外部命令调用变得十分容易,因为这是 shell 作为操作系统界面需要做的最多的事情。

    通配符也是一个很典型的例子:
    rm *.c
    用Python 写出来就得是:
    from os import unlink
    from glob import glob
    [unlink(f) for f in glob(‘*.c’)]
    很显然,通配符完全是为操作文件服务的。
    最后,pipeline 前面有人提到过了。pipeline 是 Unix tool philosophy 中很重要的一环,可惜因为先天不足,应用不广。

  6. 爱求索 2020年11月28日 11:22 上午  @回复  Δ6楼 回复

    同样实现一个功能,例如判断某个主机的存活,bash只需要一句话ping -c1 -w1 -t5 192.168.0.125>/dev/null 2>&1 && echo ok|| echo down

    而python 可能还要经历import os或者commands或者是subprocess等包,然后调用系统ping然后再来判断。。
    这种现象在很多方面都可以找到。甚至很多时候,当我无法用python(可能我没学到家)实现的时候,bash,分分钟就给我搞定。
    我信奉的是python的那个信条,我们运维人员不应该将生命浪费在代码上,诚然,如果我们能用bash搞定轻松搞定的,为什么还要绕远路呢?我想很多人会是和我一样的想法。
    曾经有一次,我想用python实现某个功能,进而想到了那个机器很差劲,想用C来实现,但是看到C的代码居然并不比python麻烦,瞬间,我感觉我的世界观崩溃了(也许,大型的程序,C的确比python复杂。)进而想到。

    或许我们在讨论某些程序的优劣或者是某些语言代替某些语言的时候,我们该想想应用场景。同样我又想到了一个同事说的一句话:不以应用场景谈语言的都是耍流氓~
    实际上很多时候,人们只会选择更方便快捷的方法来实现自己的想法。

  7. 爱求索 2020年11月28日 11:23 上午  @回复  Δ7楼 回复

    Unix 的初期硬件条件的限制决定了 *nix 的设计哲学,其中最重要的两点就是:
    一、一个工具只做一件事,并把它做好;
    二、工具之间通过 plain text 进行数据交换。
    这样的设计降低了系统的复杂度,只需要 Shell 这样的胶水语言通过搭积木的方式即可完成很多复杂的任务。由于并不需要复杂的数据结构操作,Shell 不需要成为像 Python 或者 Perl 这样完整的程序语言,而且这一条件到现在也没有发生变化。

  8. 爱求索 2020年11月28日 11:26 上午  @回复  Δ8楼 回复

    bash 是基于 字符串的。这很适合作为 系统Shell而 Python 是面向对象的,至少在 bash 设计的那个年代,不要说面向对象的系统shell了,就连面向对象都没有现在。
    的确是有 Powershell 这样面向对象的 系统Shell,但是要注意 面向对象的shell 意味着大量的 原本shell内的原生函数要重新设计,就比如 grep 等等都是纯粹的面向字符串,在操作文本,而powershell中的where完全是面向对象的,是在操作类型,二进制的数据。如果想要把 python 作为系统的shell,就必须从头设计这些工具。
    的确 windows 是成功的设计了这些工具,这是因为长久以来windows的习惯都是,用二进制的代码、数据去相互调用、交互,比如他的那一坨dll。。而powershell的出现,只是提供了一个动态语言,借由.net, 能轻松的与.net程序或者是系统dll接口 交互。
    powershell本质上操作的是 二进制对象。但 unix 的哲学是,一切皆文本,一切皆流。长久以来大家都按这样的精神设计的。这就意味着,面向对象的shell 本质上与 unix 整个系统的哲学矛盾。。
    所以,如果你要设计一个 基于python的shell 的话。。目测要重写的程序不是很少。。

  9. 爱求索 2020年11月28日 11:27 上午  @回复  Δ9楼 回复

    bash在linux上干活特别直接,读起来也短小简洁,几百台服务器上切换自如,日常运维特别好用。

    UNIX 设计哲学深入人心,组合起来,小小指令,威力无边,操作效率明显高太多。在运维领域,大部分情况下shell 的吞吐量和/或响应性比Python更好,毕竟更接近底层。经常写好shell脚本,只要不是特别长的脚本,都会尝试合并成一行或者缩成几行直接运行。

    一般写超过100行的shell脚本我都会改用python,因为用python调用库,写起来更快而且易读,虽然执行效率低了不少。但是可以长期维护,编写测试等。

    两者在运维上都用,但是python完全替代Bash不可能。也许操作系统也完全改用python写这事才会发生吧,你说这可能吗?

  10. 爱求索 2020年11月28日 11:43 上午  @回复  Δ10楼 回复

    不认为编程语言要追求健全、完美。
    尤其是新近出现并流行的语言,好多是专门为某一工作开发的。对于这类语言,找到它们的用武之地就行了。
    像python,本身并不突出,但做大数据分析时是相当方便的,个人认为这就够了。
    精通一两种主流语言之后,用别的语言都不是挑战了。与其比较这些语言,还不如先去精通,精通,不同于会用、了解、知道

外部的引用: 1 条

  • 为什么只有python成了胶水语言? | 求索阁

给我留言

留言无头像?