为什么以及何时使用shell而不是Ruby

时间:2010-02-26 16:02:16

标签: ruby scripting unix

由于我熟悉Ruby,我即将在OSX上编写一些使用它的脚本。但后来我想,也许我错过了这条船。我知道有很多理由喜欢Ruby而不是Bash(或者任何sh兼容的命令语言解释器),但我不知道有什么理由不这样做。直接编程shell的好处是什么?

我打算在必要时使用system来利用系统命令。

注意:我已经知道Ruby并不总是存在,但我对技术,语义和句法标准感兴趣。

编辑:Ruby并不总是在那里,我的意思是它不是所有* nix发行版的标准部分,与vi不同。

8 个答案:

答案 0 :(得分:21)

shell的编程语言对于除了一件事之外的所有东西都很糟糕。

管道。

shell的管道编程语言完全不受欢迎。

|&;运算符,加上()和```构成了描述管道的简洁语言。

a & b是并发的

a ; b是顺序的

a | b是Feed b

的管道

shell编程的那部分摇滚。

( a & b & c ) | tee capture | analysis视为在Python(或Ruby)中难以表达的事物。您可以使用iterpipes完成大部分操作,但不是全部。

其余大部分你可以没有,并使用Python(或Ruby),你会更快乐,更有效率。

最值得注意的是在shell级别涉及expr的任何事情。一旦你开始尝试进行“计算”,你就已经超越了shell的最佳位置,你应该停止在shell中编程并重新考虑你正在做的事情。

答案 1 :(得分:6)

Ruby有一个巨大的优势:你知道Ruby和(我猜)你不太了解Bash!

就我个人而言,我将Ruby用于复杂的脚本,而Bash用于简单的脚本 - 对我而言,断点通常是任何实际上都有一套适当的命令行参数 - 但是,我知道Bash和Ruby。

我建议你将Bash用于任何足够简单的事情,以便你可以事先在命令行上解决,例如:

who |grep -i admin |cut -c10-20 

- 并将Ruby用于其他任何事情

答案 2 :(得分:2)

bash中的核心功能是运行其他命令行应用程序。让这些程序相互交互等等。这不是ruby的设计目标(对吧?)。

答案 3 :(得分:2)

直接编写Posix或bash脚本可以很好地处理循环文件列表的操作。像

这样的事情
find . -name \*.htm | while read x; do
   # whatever
done

shell可以很好地完成命令替换和简单参数转换。 Shell程序允许相当复杂的程序合理模块化。

当需要某种内部数据结构时,就会发生向Ruby这样的过渡。 shell是一个宏处理器,因此它可以像“元编程”那样组成变量名称。某些版本的bash具有数组,所有版本都可以“元编程”变量名称,其中索引是名称的一部分。

但它是100%黑客,甚至内置阵列也很粗糙。一旦做出决策并保留数据结构,就应该切换到Ruby。

答案 4 :(得分:1)

我认为Ruby没有任何问题。您可以使用后退代码而不是system并插入内嵌内容,如

`cp ${source} ${dest}` 

此外,您可以轻松获取stdout的内容(不确定stdin)并形成您自己的小流水线操作。

我认为Ruby对于编写脚本来说是一个胜利,但是作为一般shell会更少,因为总是不得不记得放回执行命令的嘀嗒声。

答案 5 :(得分:1)

有关外壳如何处理管道的评论正在进行中。 但是,如果您对shell的rubyish方法感兴趣,可以查看rush。有立即观察(在如何处理管道之外),例如路径现在以完全不同的方式处理,但如果您想要的是易于使用迭代器和块的红宝石,那么触手可及。

在任何情况下都可能不是完全替代品,但它可能符合您的目的。

[编辑] 快速浏览一下ipython,看起来(粗略地看一眼)给出了更多的贝壳环境的自然感觉,这可能会或可能不会激励你。

答案 6 :(得分:1)

@OP,如果你想比较Ruby和Shell,请使用Ruby的解释器(没有库/模块)进行比较。即将其内部与壳体进行比较。否则,它们几乎相同。为什么?例如,如果要进行shell以外的高级数学运算,shell可以使用bc / awk / dc。这些是shell的数学“库”。如果你想要日期结构,如关联数组,你可以使用awk。 (相当于红宝石中的哈希)。在现代bash shell中,还有关联数组。您可以将* nix外部工具(例如wc,grep,sed等以及/ usr / bin /,/ usr / sbin等中的工具)视为shell的“库”。

最后,如果你打算在Ruby中使用system(),我建议使用shell作为其中一个提到的,shell在管道方面表现优异。等。

答案 7 :(得分:0)

Shell编程语言占用空间非常小,依赖性很少。除此之外,我无法看到使用它的重点。我个人更喜欢使用Perl或python来完成这些任务。