为什么脚本语言(例如Perl、Python和Ruby)不适合作为shell语言?

353

这些类似Bash (bash)、Z shell (zsh)、Fish (fish)的shell语言和上面提到的脚本语言有什么不同,使它们更适合于shell?

当使用命令行时,shell语言似乎更容易。例如,对我来说使用bash比在IPython的shell配置文件中使用要顺畅得多,尽管有相反的报道。我认为大多数人都会同意,中到大型编程的很大一部分在Python中比在Bash中更容易。我使用Python作为我最熟悉的语言。对于PerlRuby也是如此。

我试图表达原因,但无法做到,除了假设两者在字符串处理方面的不同有所关联。

提出这个问题的原因是我希望开发一种可同时使用的语言。如果您知道这样的语言,请也发布一下。

S.Lott解释说,这个问题需要一些澄清。我问的是关于shell语言与脚本语言的特性比较。因此,比较并不涉及各种交互式(REPL)环境的特点,例如历史记录和命令行替换。另一个表达该问题的方式是:

一个适合于设计复杂系统的编程语言是否能够同时表达有用的单行代码,以访问文件系统或控制任务?一个编程语言是否能够很好地进行扩展和缩小?

12个回答

3

对于Windows用户来说,我还没有感觉到需要使用PowerShell,因为我仍然使用4NT(现在是Take Command Console)来自于JP Software。它是一个非常好的shell,具有许多编程功能。所以它结合了两个世界的优点。

当你看一下,例如IRBRuby解释器),很可能通过添加更多的一行脚本来扩展它,以执行日常脚本化或大量文件管理和即时任务。


3
你在提出假设。并不是所有人都同意Shell语言是最优秀的。举个例子,_为什么

Not long ago a friend asked me how to recursively search his PHP scripts for a string. He had a lot of big binary files and templates in those directories that could have really bogged down a plain grep. I couldn't think of a way to use grep to make this happen, so I figured using find and grep together would be my best bet.

  find . -name "*.php" -exec grep 'search_string' {} \; -print

Here's the above file search reworked in Ruby:

  Dir['**/*.php'].each do |path|
    File.open( path ) do |f|
      f.grep( /search_string/ ) do |line|
        puts path, ':', line
      end
    end
  end

Your first reaction may be, "Well, that's quite a bit wordier than the original." And I just have to shrug and let it be. "It's a lot easier to extend," I say. And it works across platforms.


3
通过避免对 grep 命令的 N 次调用,对于非巨大文件来说,“find . -name '*.php' | xargs -d \\n grep -l 'search_string'” 更快。 :) - intuited
1
问题并不是关于编写类似shell脚本的内容,而是关于shell脚本所执行的语言。 - Joel Berger
3
所以你只是用一个125个字符的脚本来替换了一个60个字符的脚本,如果你理解语法的话,原来的脚本相当容易阅读,而新的脚本并没有更加清晰。这是不使用Python或Ruby的一个很好的例子。99.999%的所有脚本都有明确的规格说明(或者只是一次性的工作),不会被扩展。PowerShell甚至具有良好的语法,允许轻松扩展,并且对于脚本的主要任务来说简洁明了。 - Voo
@Voo "如果你理解语法,那么这是相当容易阅读的"……然而你自己的论点就此被否定了。除此之外,语法不仅需要被理解,还必须要被_喜欢_,如果你要在有竞争对手的情况下选择重复使用它。我不喜欢Powershell的语法,所有的驼峰式大小写都很可怕。你的经验可能会有所不同。 - ian
2
@alexis,无论是否给出相反的标志,xargsfind -exec {} +(与-exec {} \;相对)都会将每个调用填充到允许的最大参数长度,因此不,它小于N(其中N是找到的项目数)。 - Charles Duffy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接