有没有任何语言编译为Bash?

我既爱又恨编写Bash。 我喜欢这样简化操作文件和处理stream程(我同意这个stream行的问题 ,在这方面比Python,Ruby等更好),但我讨厌的语法,特别是在条件,循环等。

(这是主观的,但我觉得这两个令人困惑和烦人。例如,当阅读时,无功,但无论写作时;写入静静地失败,如果有空格左右;;如果使用正则expression式双括号;有时双分号和单分号其他人等)

作为一个编译为JS的CoffeeScript的狂热粉丝,我一直在想:是否有任何语言具有像Python / Ruby / CoffeeScript这样的语言的美学/语法,但是它们是作为Bash而不是其他运行时?

例如,我希望能够使用更简单的语法来编写大部分Bash:

 $AGGREGATE_FILENAME = 'allfiles.txt' if not exists $AGGREGATE_FILENAME touch $AGGREGATE_FILENAME for $file in files/* cat $file >> $AGGREGATE_FILENAME switch $1 case 'test' run-tests echo 'Tests finished!' case 'deploy' echo 'Packaging...' mv foo bar/ deploy-bar 

这是一个超级人为的例子,语法是一个稻草人(主要来自CoffeeScript,但保留了一stream命令的基本Bash概念,与variables分开,以及松散的打字)。

无论如何,只是一个问题和思考的食物。 我希望能够写出比Bash更好的脚本。 =)谢谢!

您也可以尝试Batsh,这是一种将C语法语言编译为Bash(和Windows批处理)的DSL( 特定于域的语言 )。

  • 项目
  • 在线演示

自从我最初提出这个问题以来,已经发布了两个攻击这个问题的项目,并做了相当不错的工作。 两者都在更多的编程友好的运行时重新实现了许多/大多数Unix工具。

铅在Python中实现,看起来很稳定:

http://plumbum.readthedocs.org/en/latest/index.html

ShellJS在Node.js上实现,看起来还不错:

https://github.com/arturadib/shelljs

令人兴奋的发展! 我期待着尝试一下。 如果你已经有了,在评论中听到你的经验会很棒。 谢谢!

问题是Bash的基于string的整个语义是如此可怕地被破坏,为Bash做类似CoffeeScript的事情是相当困难的。

既然你可能不需要函数级别的互操作性来调用用Bash编写的函数,你最好使用完全不同的东西。 Perl在讨厌和充满快捷方式和奇怪的语法方面接近Bash,但其语义大多是合理的。 对于诸如启动进程之类的东西,Python不太舒服,但是对于一般的系统编程来说更好,干净且易于维护。 Python拥有伟大的库和模块, Perl甚至更好。

比什是另一种select:

https://github.com/tdenniston/bish

具有现代感的Shell脚本。

Bish是为了将shell脚本引入21世纪而创build的轻量级语言。 它为程序员提供了现代语法的舒适性,但编译为Bash,导致良好的可移植性(就像Bash是便携式一样)。

你可能想试试ZSh,它有很多的改进,使你的shell脚本更具可读性。

http://www.zsh.org

我尝试了所有上述( 结果 ),并开始powscript

差异powscript与上述工具

  • 极其便携的预处理器(100%bash)
  • coffeescript和bash之间的平衡
  • 无忧无虑的便携式一体化编译器/运行库,用bash编写
  • 松散的编译器:内联bash总是可能的

你可能想看看nscript ,你可以使用javascript编写shell脚本。 所有常见的bash结构都在那里,如退出代码,pipe道,streamredirect,参数扩展,通配符,提示符等。

我最近开发了一种名为BashClass的 面向对象的语言,它具有types检查function并允许多维数组。 语言语法受不同编程语言的启发。

下面是一个如何实现List类的例子(完整的例子在这里 ):

 class List extends Object { var Object[] data = new Object[]; var int size = 0; constructor List(){ super_constructor(); } function void add(var Object object) { data[size] = object; size = size + 1; } function void pop() { if(size == 0) { exception("Cannot remove element from an empty list"); } size = size - 1; data[size] = null; } function int size() { return size; } function Object get(var int index) { if(index < 0 || index >= size) { exception("Cannot access element out of bound"); } return data[index]; } } 

BashClass中的类和multidimensional array被转换为Bash 4.4关联数组。 该语言是第一个版本,并在Github上是开源的。 随意contirbute和build议function。