coffeeはコマンドラインで使えるか

せっかくCoffeeScriptを知ったのだから、コマンドラインに活かしたいです。
本来の使い方とは異なるのでしょうけど、やはり、他コマンドとの連携ができたらいいなあと思ってしまいます。

前回はインタラクティブモード(REPL)と、コンパイル(-c)を使ってみました。

perlの-eオプションのように、コマンドラインでスクリプトを書くことができるオプションがないか探してみます。
–helpを確認。

takk@deb9:~/tmp$ coffee --help

Usage: coffee [options] path/to/script.coffee -- [args]

If called without options, `coffee` will run your script.

  -b, --bare         compile without a top-level function wrapper
  -c, --compile      compile to JavaScript and save as .js files
  -e, --eval         pass a string from the command line as input
  -h, --help         display this help message
  -i, --interactive  run an interactive CoffeeScript REPL
  -j, --join         concatenate the source CoffeeScript before compiling
  -m, --map          generate source map and save as .js.map files
  -n, --nodes        print out the parse tree that the parser produces
      --nodejs       pass options directly to the "node" binary
      --no-header    suppress the "Generated by" header
  -o, --output       set the output directory for compiled JavaScript
  -p, --print        print out the compiled JavaScript
  -r, --require      require the given module before eval or REPL
  -s, --stdio        listen for and compile scripts over stdio
  -l, --literate     treat stdio as literate style coffee-script
  -t, --tokens       print out the tokens that the lexer/rewriter produce
  -v, --version      display the version number
  -w, --watch        watch scripts for changes and rerun commands

takk@deb9:~/tmp$

-eオプションがありました。evalなので、きっとこれで動くでしょう。

takk@deb9:~/tmp$ coffee -e 'console.log 1+2'
3
takk@deb9:~/tmp$

使えそうです。

次は標準入力をどのように受け取るか。
いろんなサイトを探しましたが、これというものが見つかりませんので、キーワードの断片を組み合わせて、試行錯誤してみます。

takk@deb9:~/tmp$ seq 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input"
<Buffer 31 0a 32 0a 33 0a>
takk@deb9:~/tmp$

数字とaが出てきました。
1
2
3
と出てほしかったのですが、何かに変換されています。
確認のためseq 10をcoffeeに渡してみると、

takk@deb9:~/tmp$ seq 10 | coffee -e "process.stdin.on 'data',(input)-> console.log input"
<Buffer 31 0a 32 0a 33 0a 34 0a 35 0a 36 0a 37 0a 38 0a 39 0a 31 30 0a>
takk@deb9:~/tmp$

1,2,3をcoffeeへ渡すと、

takk@deb9:~/tmp$ seq -s, 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input"
<Buffer 31 2c 32 2c 33 0a>
takk@deb9:~/tmp$

やはり。文字コードが表示されているようです。しかも16進で。
もしかしてinputは配列なのでしょうか。

takk@deb9:~/tmp$ seq -s, 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input[0],input[1]"
49 44
takk@deb9:~/tmp$

ズバリ、配列でしたね。
ということは、文字列にするには、joinかなにかで連結すれば良いのでしょうか。

takk@deb9:~/tmp$ seq -s, 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input.join()"
49,44,50,44,51,10
takk@deb9:~/tmp$

数字のままです。
というか、文字列に変換するべきか。
良い言語であれば、思ったことを書けば、そのまま動くでしょうから、文字列に変換するには、toStrあたりか。

takk@deb9:~/tmp$ seq -s, 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input.toStr()"
.:3
    return console.log(input.toStr());
                             ^

TypeError: input.toStr is not a function
  at Socket.<anonymous> (.:3:30)
  at emitOne (events.js:77:13)
  at Socket.emit (events.js:169:7)
  at readableAddChunk (_stream_readable.js:153:18)
  at Socket.Readable.push (_stream_readable.js:111:10)
  at Pipe.onread (net.js:540:20)

takk@deb9:~/tmp$

いやあ、だめですねえ。
いや待てよ、メッセージを見ると、英語を省略して書いてない気がします。

takk@deb9:~/tmp$ seq -s, 3 | coffee -e "process.stdin.on 'data',(input)-> console.log input.toString()"
1,2,3

takk@deb9:~/tmp$

文字列になりました。

なんとなく、癖が見えてきたので、いろいろできそうです。
とりあえず、16進に勝手に変換されるということは、ダンプに使えそうです。

takk@deb9:~/tmp$ seq 80 | perl -ne 'print chr' | coffee -e "process.stdin.on 'data',(input) -> console.log input"
<Buffer 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 ... >
takk@deb9:~/tmp$

むむっ。全部表示されてない。
ん〜、せっかく覚えたコマンドなので、もう少し考えてみます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA