Bash (Bash)、Z shell (zsh)、Fish (Fish)等shell语言和上面的脚本语言之间有什么区别,使它们更适合于shell?
在使用命令行时,shell语言似乎要容易得多。例如,对我来说,使用bash比在IPython中使用shell配置文件要流畅得多,尽管报告与此相反。我想大多数人都会同意我的观点,在Python中进行大部分中型到大型的编程比在Bash中更容易。我使用Python作为我最熟悉的语言。Perl和Ruby也是如此。
我试着阐明原因,但我不能,除了假设两者对字符串的不同处理与此有关。
提出这个问题的原因是我希望开发一种两者都可用的语言。如果你知道这样的语言,也请贴出来。
正如s .洛特所解释的,这个问题需要一些澄清。我问的是shell语言和脚本语言的特性。因此,比较不是关于各种交互(REPL)环境的特征,如历史记录和命令行替换。这个问题的另一种表达方式是:
适合于复杂系统设计的编程语言是否能够同时表达可以访问文件系统或控制作业的有用的一行程序?一种编程语言能有效地扩展和缩小吗?
如果你知道这样的语言,也请贴出来。
Tcl就是这样一种语言。主要是因为它主要被设计为CAD程序的shell解释器。以下是一位铁杆Python程序员体会到Tcl为何被设计成这样的经历:我不敢相信我在称赞Tcl
对我来说,我已经编写并一直在使用并改进了Tcl shell(当然是用Tcl编写的),作为我在自制路由器上的主要Linux登录shell: Pure Tcl readline
总的来说,我喜欢Tcl的一些原因与它与传统shell的语法相似有关:
At its most basic, Tcl syntax is command argument argument.... There's nothing else. This is the same as Bash, C shell or even DOS shell.
A bareword is considered a string. This is again similar to traditional shells allowing you to write: open myfile.txt w+ instead of open "myfile.txt" "w+".
Because of the foundations of 1 and 2, Tcl ends up with very little extraneous syntax. You write code with less punctuation: puts Hello instead of printf("Hello");. When writing programs you don't feel the hurt so much, because you spend a lot of time thinking about what to write. When you use a shell to copy a file you don't think you just type and having to type ( and " and , and ) and ; again and again gets annoying very quickly.
*注:不是我;我是一个铁杆的Tcl程序员
shell语言必须易于使用。您希望键入一次性的丢弃命令,而不是小程序。也就是说,你想要打字
ls -laR /usr
not
shell.ls("/usr", long=True, all=True, recursive=True)
这(也)意味着shell语言并不真正关心参数是选项、字符串、数字还是其他东西。
此外,shell中的编程构造是一个附加组件,甚至不总是内置的。例如,考虑Bash或Bourne shell (sh)中if和[的组合,用于生成序列的seq,等等。
最后,shell具有在编程中较少或不同的特定需求。例如,管道、文件重定向、进程/作业控制等等。
由于这两种语言都是正式的编程语言,所以在一种语言中可以做的事情,在另一种语言中也可以做。实际上,这是一个设计重点问题。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语言可以存储和调用值,但是每个命令的作用域都是短暂的。