Bash (Bash)、Z shell (zsh)、Fish (Fish)等shell语言和上面的脚本语言之间有什么区别,使它们更适合于shell?

在使用命令行时,shell语言似乎要容易得多。例如,对我来说,使用bash比在IPython中使用shell配置文件要流畅得多,尽管报告与此相反。我想大多数人都会同意我的观点,在Python中进行大部分中型到大型的编程比在Bash中更容易。我使用Python作为我最熟悉的语言。Perl和Ruby也是如此。

我试着阐明原因,但我不能,除了假设两者对字符串的不同处理与此有关。

提出这个问题的原因是我希望开发一种两者都可用的语言。如果你知道这样的语言,也请贴出来。

正如s .洛特所解释的,这个问题需要一些澄清。我问的是shell语言和脚本语言的特性。因此,比较不是关于各种交互(REPL)环境的特征,如历史记录和命令行替换。这个问题的另一种表达方式是:

适合于复杂系统设计的编程语言是否能够同时表达可以访问文件系统或控制作业的有用的一行程序?一种编程语言能有效地扩展和缩小吗?


当前回答

No.


不,脚本语言可能不适合shell。


问题在于宏语言和其他所有语言之间的二分法。

shell与其他遗留宏语言(如nroff和m4)属于一类。在这些处理器中,所有内容都是字符串,处理器定义了从输入字符串到输出字符串的映射。

在所有语言中,某些边界都是双向交叉的,但通常很清楚系统的类别是宏观的还是,嗯,我不知道有一个官方术语……我会说“一种真正的语言”。

当然,您可以用Ruby这样的语言输入所有的命令,它甚至可能是仅次于真正shell的次优选择,但它永远不会是宏语言。有太多的语法需要考虑。它需要太多的引号。

但是在开始使用宏语言编程时,宏语言也有它自己的问题,因为必须做出太多妥协才能摆脱所有语法。输入字符串时不带引号。需要重新引入各种神奇的方法来注入缺失的语法。我在nroff做过一次code-golf,就是为了与众不同。这很奇怪。宏语言中大型实现的源代码是可怕的。

其他回答

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

例如,当您研究IRB (Ruby解释器)时,一定很有可能使用更多的一行程序来扩展它,以执行日常脚本化或大规模文件管理,以及处理分钟级任务。

这些答案激励我接管基于perl的shell Zoidberg的维护工作。经过一些修复后,它又可以使用了!

查看用户指南或使用您最喜欢的CPAN客户端安装Bundle::Zoidberg。

我认为这是一个分析的问题。Shell语言默认假设普通的$ xxx命令意味着要运行的命令。在Python和Ruby中需要你做系统(“命令”)或其他什么。

并不是说它们不合适,只是还没有人真正做过;至少我是这么认为的。Rush是Ruby中的一个例子,Python有IPython或类似的东西。

由于这两种语言都是正式的编程语言,所以在一种语言中可以做的事情,在另一种语言中也可以做。实际上,这是一个设计重点问题。Shell语言是为交互使用而设计的,而脚本语言不是。

The basic difference in the design is the storage of data between commands and the scope of variables. In Bash, etc. you have to jump through hoops to store a value (for example, commands like set a='something'), while in languages like Python you simply use an assignment statement (a = 'something'). When using the values in a shell language you have to tell the language that your want the value of the variable, while in scripting languages you have to tell the language when you want the immediate value of the string. This has effects when used interactively.

在脚本语言中,ls被定义为命令

a = some_value

ls a*b  

(a是什么意思?这意味着some_value *(不管b是什么)还是你的意思 “'anystring b ?。在脚本语言中,默认值是存储在内存中的。)

ls 'a*b'  Now means what the Unix ls a*b means.

用类似bash的语言

set a=some_value

ls a*b   means what the Unix ls a*b means.

ls $a*b  uses an explicit recall of the value of a.

脚本语言使得存储和检索值变得容易,而值上的瞬态作用域却很难实现。Shell语言可以存储和调用值,但是每个命令的作用域都是短暂的。

你在回避这个问题。并不是每个人都认为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.