【问题标题】:Are there any languages that compile to Bash?有没有编译成 Bash 的语言?
【发布时间】:2012-05-01 15:01:46
【问题描述】:

我既喜欢又讨厌写 Bash。我喜欢它如此简化了操作文件和处理进程(我同意this popular question,在这方面它比 Python、Ruby 等要好得多),但我讨厌 语法,特别是围绕条件、循环等。

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

作为可编译为 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 启发,但保留了一流命令的基本 Bash 概念,与变量分离,以及松散的类型)。

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

【问题讨论】:

  • 你考虑过 Perl 吗?它具有文件 glob、简洁的存在检查 (print 'exists' if (-e $filename);) 和反引号执行。
  • 我实际上从未尝试过 Perl。我在写这个问题时想到了它,但我一直认为 Perl 也充满了难以理解的语法。 =D 我去看看——谢谢!
  • 可以的。幸运的是,您不需要自己真正使用其中的大部分内容。
  • 说说你对 Perl 的看法,但是一旦你的脚本超过 15 行,它就是 bash 的一个很好的替代品。它几乎可以保证安装在 Bash 的任何地方。
  • 较新的外壳为向后兼容旧外壳提供了很多余地。您可以简化您的语法,决定始终使用[[ ..... && .... || ... ]],作为一个夸张但有时适当的示例。这种风格[ .. ] && [ .... ] 可以追溯到最初的 bourne shell,有些人觉得有必要使用它来实现可移植性。另请注意,当您需要 cmd-substituion 时,您可以在 (( a++ ))cnt=$(( a++ )) 内进行任何数学运算,这无疑是一个不好的例子。无法帮助单个';'除了将每个命令放在单独的行上。 ';;'特定于案例陈述。祝你好运。

标签: bash shell scripting coffeescript


【解决方案1】:

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

【讨论】:

  • 据我所知 Batsh 项目已被放弃。使用 opam 1.2.2 版我无法安装(编译器错误)
【解决方案2】:

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

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

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

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

https://github.com/arturadib/shelljs

令人兴奋的发展!我期待着尝试一下。如果你已经有,很高兴听到你在 cmets 的经历。谢谢!

【讨论】:

  • shelljs 不能编译成 bash。
  • 看起来也不像铅
【解决方案3】:

我尝试了以上所有方法 (results) 并开始powscript

powscript 与上述工具的区别

  • 非常便携的预处理器(100% bash)
  • coffeescript 和 bash 之间的平衡
  • 用 bash 编写的无忧便携式多合一文件编译器/运行时
  • 松散的转译器:内联 bash 总是可行的

【讨论】:

  • 我实际上正在使用 powscript 并且非常喜欢它。我只想说解释器应该更冗长。
  • 太棒了,你做了这个并尝试了其他的,感谢发布它
【解决方案4】:

比什是另一种选择:

https://github.com/tdenniston/bish

具有现代感的 Shell 脚本。

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

【讨论】:

    【解决方案5】:

    问题是 Bash 的整个基于字符串的语义被严重破坏,很难为 Bash 做类似 CoffeeScript 之类的事情。

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

    【讨论】:

    • 我真的不认为 Perl 是这个人想要的,考虑到他希望在他的脚本中减少“噪音”。
    【解决方案6】:

    我最近开发了一种名为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】:

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

      http://www.zsh.org

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 1970-01-01
          • 2011-02-21
          相关资源
          最近更新 更多