SlideShare a Scribd company logo
Groovy Shell Scripting
2015
JGGUG G*Workshop 2015/06/26
上原潤二(NTTソフトウェア)
わたくしは
上原潤二(@uehaj)
NTTソフトウェア(株)Grails推進室
JGGUG運営委員
書いたり
プログラミングGROOVY(技術評論社)
Grails徹底入門(翔泳社)
ブログ「Grな日々」
Groovyスクリプト使ってますか?
Groovyスクリプトとは
クラス定義に囲まれていない、トップレベル
の文や関数定義から構成
binding変数が使える
コンパイルしない
スクリプトは日々作業に便利
編集してすぐ再実行できる
コンパイルやIDEやGradleとかは不要
おおげさなインストールも不要(置くだけ)
でも…
いくつか問題がある。
プロセスの扱い
クラスパス問題
(問題1) プロセスの扱い
プロセス起動の諸問題
"ls -l".execute()
出力は?
println("ls -l".execute().text)
標準エラーは
どこへ?
"ssh host.example.com ls".execute()
パスワードを聞いてき
たら何がおきる?
ProcessBuilder#inheritIO()
本日のネタ:これをGroovyらしい
形で有効活用しようではないか
String.metaClass.exec
String.metaClass.exec0	
  =	
  {	
  
	
  def	
  st	
  =	
  new	
  StringTokenizer(delegate)	
  
	
  new	
  ProcessBuilder(st.collect()).inheritIO().start()	
  
}	
  
"login".exec0().waitFor()	
  
println	
  "done"	
  
waitForはProcessのメソッド
パイプ
String.metaClass.or	
  =	
  {	
  String	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  delegate.execute()	
  |	
  rhs.execute()	
  
}	
  
Process.metaClass.or	
  =	
  {	
  String	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  delegate	
  |	
  rhs.execute()	
  
}	
  
String.metaClass.or	
  =	
  {	
  Process	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  delegate.execute()	
  |	
  rhs	
  
}	
  
"echo	
  123abc"	
  |	
  
	
  "tr	
  'a-­‐z'	
  'A-­‐Z'"	
  |	
  
	
  "grep	
  B".exec(input:Redirect.PIPE)
色付きGrepが機能(isatty)
https://github.com/uehaj/groovy-shell-scripting-examples
リダイレクト
@groovy.transform.BaseScript(cmd.Base1)	
  
import	
  java.lang.String	
  
"sed	
  -­‐e	
  s/[a-­‐z]/A/g".exec(input:"input.txt",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  output:"output.txt")	
  
println	
  new	
  File("input.txt").text	
  
println	
  new	
  File("output.txt").text
https://github.com/uehaj/groovy-shell-scripting-examples
メソッド追加はいつやるの?
staticイニシャライザ
不安
拡張メソッド?
Jarに梱包する必要がありスクリプト用として
は面倒
@BaseScriptで簡単確実
Since: Groovy 2.2.0
package	
  cmd	
  
import	
  java.util.StringTokenizer	
  
import	
  static	
  java.lang.ProcessBuilder.Redirect	
  
abstract	
  class	
  Base0	
  extends	
  Script	
  {	
  
	
  	
  	
  	
  abstract	
  Object	
  runScript()	
  
	
  	
  	
  	
  Object	
  run(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  String.metaClass.exec	
  =	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  def	
  st	
  =	
  new	
  StringTokenizer(delegate)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  new	
  
ProcessBuilder(st.collect()).inheritIO().start()	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  String.metaClass.or	
  =	
  {	
  String	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  delegate.execute()	
  |	
  rhs.execute()	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  Process.metaClass.or	
  =	
  {	
  String	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  delegate	
  |	
  rhs.execute()	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  String.metaClass.or	
  =	
  {	
  Process	
  rhs	
  -­‐>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  delegate.execute()	
  |	
  rhs	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  runScript()	
  
	
  	
  	
  	
  }	
  
}
@groovy.transform.BaseScript(cmd.Base0)	
  
import	
  java.lang.String	
  
"login".exec().waitFor()	
  
println	
  "done"
@BaseScriptの有用性
DSLを作るための手軽な仕掛け置き場
methodMissing, getProperty…
Groovyスクリプトでは特定の名前の変数を
定義(クロージャ、マップ、…)
それに対してBase側で任意の処理
(問題2) クラスパス問題
スクリプトのクラスパス問題(1 of 2)
スクリプトを実行可能プログラムのように
起動
そのとき、以下を読めるようにクラスパス
を指定したい
@BaseSciriptの対象
スクリプトから利用するクラス
問題: shebangは$0を解釈しない
スクリプトのクラスパス問題(2 of 2)
スクリプトの場所($0)相対で読みこんで欲
しい
スクリプトごとにCLASSPATH環境変数に追
加したくない😔
すべてを /.groovy/libにぶちこむのはもっと
嫌😖
Perl, Ruby, Pythonなどではあたりまえの話
Groovyスクリプトを呼び出すShell Script/.bat
を書く
あきらかな負け 😖
Linux,MacOS
以下のようにすると勝つる 😃
#!/bin/bash	
  
//usr/bin/env	
  groovy	
  -­‐cp	
  "`dirname	
  $0`"	
  "$0"	
  $@;	
  exit	
  $?	
  
@groovy.transform.BaseScript(cmd.Base1)	
  
…
├── thisscript.groovy
└── cmd/
└── Base1.groovy
Windows
スクリプトはPATHの通ったところに置いた上で「管理
者として実行」したコマンドプロンプトで以下を実行
ただし、
PATH配下をすべて見てしまう 😟
「ダブルクリックしてスクリプト起動」に対応しない
assoc	
  .groovy=groovyscript	
  
ftype	
  groovyscript=C:groovy-­‐2.4.1bingroovy.bat	
  -­‐cp	
  "%PATH%”	
  "%1"	
  %*
まとめ
日々作業はGroovyで片付けよう!!
おまけ
docopt.java便利
参考リンクなど
@BaseScriptアノテーションはscriptをインクルードする
のに使えます

http://uehaj.hatenablog.com/entry/2014/04/25/
220853
https://github.com/docopt/docopt.java
サンプルコード

https://github.com/uehaj/groovy-shell-scripting-
examples

More Related Content

PDF
Groovy Bootcamp 2015 by JGGUG
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
PDF
New features of Groovy 2.0 and 2.1
PDF
Use JWT access-token on Grails REST API
PDF
Markup Template Engine introduced Groovy 2.3
PDF
Introduce Groovy 2.3 trait
PDF
GroovyServ concept, how to use and outline.
PDF
groovy 2.1.0 20130118
Groovy Bootcamp 2015 by JGGUG
Java開発の強力な相棒として今すぐ使えるGroovy
New features of Groovy 2.0 and 2.1
Use JWT access-token on Grails REST API
Markup Template Engine introduced Groovy 2.3
Introduce Groovy 2.3 trait
GroovyServ concept, how to use and outline.
groovy 2.1.0 20130118

What's hot (19)

PDF
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
PDF
Groovyの紹介20130323
PPT
第4回勉強会 Groovyの文法からSpockまで
PDF
Groovy base gradle_20130309
KEY
G* Workshop in fukuoka 20120901
PDF
Gws 20130315 gradle_handson
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
Read Groovy Compile process(Groovy Benkyoukai 2013)
PDF
Java SE 9の紹介: モジュール・システムを中心に
KEY
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
PDF
enterprise grails challenge, 2013 Summer
PDF
New feature of Groovy2.0 G*Workshop
PDF
An Internal of LINQ to Objects
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
キメるClojure
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
SignalRブートキャンプ
PDF
linq.js - Linq to Objects for JavaScript
KEY
JJUG CCC 2012 Real World Groovy/Grails
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Groovyの紹介20130323
第4回勉強会 Groovyの文法からSpockまで
Groovy base gradle_20130309
G* Workshop in fukuoka 20120901
Gws 20130315 gradle_handson
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Read Groovy Compile process(Groovy Benkyoukai 2013)
Java SE 9の紹介: モジュール・システムを中心に
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
enterprise grails challenge, 2013 Summer
New feature of Groovy2.0 G*Workshop
An Internal of LINQ to Objects
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
キメるClojure
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
SignalRブートキャンプ
linq.js - Linq to Objects for JavaScript
JJUG CCC 2012 Real World Groovy/Grails
Ad

Similar to Groovy Shell Scripting 2015 (20)

PDF
Hudson using Groovy #jggug
PDF
明日から使えるgradle
PPTX
Groovyスクリプト"再"入門 起動編
PPTX
Jenkins と groovy
ODP
こんにちはGroovy
PPT
G*workshop sendai 20100424(v2)
PDF
Groovy kisobenkyoukai20130309
PDF
Gws 20120521 gradle
PDF
ジャパネットQB GPars
PDF
今日からはじめるGPars
PDF
G* Workshop in Fukuoka - Introduction
PPTX
Jenkins x Kubernetesが簡単だと思ったら大変だった話
PPTX
開発を彩る技術たち
PDF
「プログラミングGroovy」入門(公開用)
PDF
Spring in-summer-gradle-hands on-withanswers
PDF
入門 シェル実装
PDF
Gradleどうでしょう
PDF
Grailsのススメ(仮)
PPT
第5回勉強会
PDF
G * magazine 0
Hudson using Groovy #jggug
明日から使えるgradle
Groovyスクリプト"再"入門 起動編
Jenkins と groovy
こんにちはGroovy
G*workshop sendai 20100424(v2)
Groovy kisobenkyoukai20130309
Gws 20120521 gradle
ジャパネットQB GPars
今日からはじめるGPars
G* Workshop in Fukuoka - Introduction
Jenkins x Kubernetesが簡単だと思ったら大変だった話
開発を彩る技術たち
「プログラミングGroovy」入門(公開用)
Spring in-summer-gradle-hands on-withanswers
入門 シェル実装
Gradleどうでしょう
Grailsのススメ(仮)
第5回勉強会
G * magazine 0
Ad

More from Uehara Junji (15)

PDF
Shibuya JVM Groovy 20150418
PDF
Java x Groovy: improve your java development life
KEY
Groovy 1.8の新機能について
PDF
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
KEY
Jggug ws 15th LT 20110224
PDF
Easy Going Groovy 2nd season on DevLOVE
PDF
Easy Going Groovy(Groovyを気軽に使いこなそう)
PDF
Clojure
PDF
Groovy, Transforming Language
KEY
Jggug Nagoya 20090925 Groovy
PDF
Lisp Builder
PDF
G*WS 3rd Lightning talk
PDF
Groovy Now And Future
PDF
Seasar Conference2008 Grails(Final)
PPT
Groovy Conference2008 Nttsoft
Shibuya JVM Groovy 20150418
Java x Groovy: improve your java development life
Groovy 1.8の新機能について
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Jggug ws 15th LT 20110224
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy(Groovyを気軽に使いこなそう)
Clojure
Groovy, Transforming Language
Jggug Nagoya 20090925 Groovy
Lisp Builder
G*WS 3rd Lightning talk
Groovy Now And Future
Seasar Conference2008 Grails(Final)
Groovy Conference2008 Nttsoft

Groovy Shell Scripting 2015