有没有可以编译成Bash的语言?

时间:2012-04-20 01:55:09

标签: bash shell scripting coffeescript

我既爱又恨写Bash。我喜欢它是所以简化操作文件和处理进程(我同意this popular question它在这方面比Python,Ruby等更好,但我讨厌语法,特别是在条件,循环等方面。

(这是主观的,但我发现它既令人困惑又烦人。例如,$var阅读时,var写作时;如果=周围有空格,则无声写入会失败;使用正则表达式时ifs中的双括号;有时双分号和其他单分号;等等。)

作为编写JS的CoffeeScript的忠实粉丝,我一直在想:是否有任何语言具有Python / Ruby / CoffeeScript等语言的美学/语法,但是编译和运行为Bash而不是其中之一那些其他的运行时间?

E.g。我希望能够用更简单的语法编写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的启发,但保留了一流命令的基本Bash概念,与变量分开,以及松散的输入)。

无论如何,只是一个问题和思考的问题。我能够用比Bash更好的东西编写我的脚本。 =)谢谢!

8 个答案:

答案 0 :(得分:18)

你也可以尝试使用Batsh,这是一个DSL(Domain-Specific Language),它将C语法语言编译为Bash(和Windows Batch)。

答案 1 :(得分:15)

由于我最初提出这个问题,已经发布了两个攻击这个问题的项目并且做得很好。两者都在更多编程友好的运行时重新实现了许多/大多数Unix工具。

Plumbum是用Python实现的,看起来非常可靠:

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

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

https://github.com/arturadib/shelljs

激动人心的发展!我很期待尝试一下。如果您已经拥有,那么在评论中听到您的经历会很棒。谢谢!

答案 2 :(得分:6)

Bish是另一种选择:

https://github.com/tdenniston/bish

  

具有现代感的Shell脚本。

     

Bish是一种轻量级语言,旨在将shell脚本带入21世纪。它为程序员提供了现代语法的舒适性,但编译为Bash,从而实现了良好的可移植性(就像Bash是可移植的一样)。

答案 3 :(得分:5)

问题是Bash的整个基于字符串的语义是如此可怕地被打破,对于像Bash这样的CoffeeScript来说很难做。

由于您可能不需要函数级互操作性来调用用Bash编写的函数,因此最好使用完全不同的函数。 Perl接近Bash是令人讨厌的,充满了快捷方式和奇怪的语法,但它的语义大多是合理的。 Python对于诸如启动进程之类的东西不太舒服,但对于一般系统编程来说要好得多,干净且易于维护。 Python拥有适用于所有内容的优秀库和模块; Perl甚至更好。

答案 4 :(得分:4)

我尝试了上述所有内容(results)并开始 powscript

差异 powscript 与上述工具相比

  • 非常便携的预处理器(100%bash)
  • coffeescript和bash之间的平衡
  • hasslefree可移植的一体化文件编译器/运行时,用bash编写
  • 松散的transpiler:内联bash始终可能

答案 5 :(得分:2)

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

http://www.zsh.org

答案 6 :(得分:2)

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

以下是有关如何实施List类的示例(完整示例here):

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中的类和多维数组被转换为Bash 4.4关联数组。该语言是第一个版本,在Github上是开源的。随意提出并建议功能。

答案 7 :(得分:1)

您可能需要查看nscript,您可以使用javascript编写shell脚本。所有常见的bash结构都在那里,如退出代码,管道,流重定向,参数扩展,通配,提示等。