コマンドプロンプトから色々な処理系でワンライナーしてみた

使えるツールは多いほうが都合が良いかもしれない、ということで。

ActivePerl 5.8.8.817 MSWin32-x86-multi-thread

  • a、-F、-i、-n、-pあたりと組み合わせると便利そう。特に-nと-pを使うとawkのように使えるみたい。だけどperlは使わないのでよく分からない。
D:\temp>perl -e "print 3 * 2"
6
D:\temp>perl -e "for ($i = 0; $i < 3; ++$i) { print \"$i\n\" }"
0
1
2

D:\temp>perl -e "foreach $i (0..2) { print \"$i\n\" }"
0
1
2

D:\temp>

GNU Awk 3.1.6

そういえば、BEGINだけなら入力データがなくても実行可能だった。『プログラミング言語AWK』にも似たような例があったので、元からこうなんだろう。

D:\temp>gawk "BEGIN { print 3 * 2 }"
6

D:\temp>gawk "BEGIN { for (i = 0; i < 3; ++i) print i }"
0
1
2

D:\temp>

GNU CLISP 2.41

出力用の手続きを呼ばなくても、評価した結果が表示されるみたい。

D:\temp>clisp -q -x "(* 3 2)"
6

D:\temp>clisp -q -x "(loop for i in '(0 1 2) do (print i))"

0
1
2
NIL

D:\temp>

GNU bash 2.04.0(1)-release

shやbashを-cオプション付きで実行する、具体的なシチュエーションが思い浮かばない。MSYS付属のmakeなんかは内部的にsh(bash)を-c付きで実行してる気がするけど。

D:\temp>bash -c "expr 2 + 3"
5

D:\temp>bash -c "for i in 0 1 2; do echo $i; done"
0
1
2

D:\temp>

Gauche 0.8.13

最後に「-e "(exit)"」と付ける所が少し面倒。

D:\temp>gosh -e "(print (* 3 2))" -e "(exit)"
6

D:\temp>gosh -E "print (* 3 2)" -E exit
6

D:\temp>gosh -u srfi-1 -e "(for-each print (iota 3))" -e "(exit)"
0
1
2

D:\temp>

JavaScript-C 1.7.0 2007-10-03 (SpiderMonkey)

JavaScriptだってワンライナーの時代(かなり誇張)。オプション-eって伝統的なものなのかも*1

D:\temp>js -e "print(3 * 2)"
6

D:\temp>js -e "for (i = 0; i < 3; ++i) print(i)"
0
1
2

D:\temp>js -e "for (i in Array(0, 1, 2)) print(i)"
0
1
2

D:\temp>

Ruby-mswin32 1.8.7 p72

本家のリファレンスにも書いてあるけど、perlのオプションと似ている。-0、-F、-n、-p、-rあたりと組み合わせると便利。

D:\temp>ruby -e "p 3 * 2"
6

D:\temp>ruby -e "3.times {|i| p i }"
0
1
2

D:\temp>ruby -e "0.upto(2) {|i| p i }"
0
1
2

D:\temp>ruby -e "(0..2).each {|i| p i }"
0
1
2

D:\temp>ruby -e "for i in 0..2; p i; end"
0
1
2

D:\temp>echo hoo:bar:baz: | ruby -072 -n -e "p $_ if !/\n/"
"hoo:"
"bar:"
"baz:"

D:\temp>

SCM 5e5

Gaucheと違って、最後に「-e "(exit)"」と付ける必要はない。

D:\temp>scm -e "(print (* 3 2))"
6

D:\temp>scm -c "(print (* 3 2))"
6

D:\temp>scm -r srfi-1 -e "(for-each print (iota 3))"
0
1
2

D:\temp>

tcsh-6.13.00 for Win32 7.09

ワンライナーだとforeachがうまく使えなかった。なんでだろう?

D:\temp>tcsh -c "expr 2 + 3"
5

D:\temp>tcsh -c "echo foo bar baz"
foo bar baz

D:\temp>

*1:sedにも-eってあるもんなあ。