SlideShare a Scribd company logo
GROOVYON
THESHELL
SHELLSCRIPTINGWITHGROOVY
Alexander Klein /http://codecentric.de alexander.klein@codecentric.de
0
WHY?
GROOVY
IS
COOL
BECAUSE
I
CAN
TODOCOMPLEXSTUFF
TESTINGYOURSCRIPTS
IFYOUKNOWGROOVY
BETTERTHANBASH
ALEXANDER(SASCHA)KLEIN
 
Principal Consultant
codecentric AG
Stuttgart
 
Groovy, JavaFX, UI / UX
 
Griffon committer
 
alexander.klein@codecentric.de
@saschaklein
http://gplus.to/karfunkel
EXECUTING
GROOVY
SCRIPTS$ groovy Test.groovy
SHE-BANG-COMMENT(#!)
#!/usr/local/bin/groovy
USINGTHEDEFAULT
ENVIRONMENT
#!/usr/bin/env groovy
DEFININGTHECLASSPATH
#!/usr/bin/env groovy -cp myjar.jar
USINGSYSTEMVARIABLES
#!/usr/bin/env groovy -cp ${HOME}/bin
DEFININGSYSTEMVARIABLES
#!/usr/bin/env VAR1=value1 VAR2=value2 groovy
BUT
DOESNOTWORKONLINUX
Alternative script for /usr/bin/env
Without defining system variables
#!/bin/bash
ARGS=( $1 ) # separate $1 into multiple space-delimited arguments.
shift # consume $1
PROG=`which ${ARGS[0]}` # find path for executable
unset ARGS[0] # discard executable name
ARGS+=( "$@" ) # remainder of arguments preserved "as-is".
# iterate array and expand variables
declare -a PARAMS
for i in "${ARGS[@]}"
do
PARAMS=("${PARAMS[@]}" "`eval "echo $i"`")
done
exec $PROG "${PARAMS[@]}" # execute the command
GROOVYSERV
FASTERSTARTUP
JVM process running in the background
Scriptstart ~10-20 times faster
INSTALLATION
WINDOWS
GroovyServ is part of the Groovy Windows-Installer
LINUX
gvm install groovyserv
MACOSX
brew install groovyserv
BINARYPACKAGE
$ cd /tmp
$ unzip groovyserv-1.0.0-bin.zip
$ groovyserv-1.0.0-bin/bin/setup.sh
export PATH=/tmp/groovyserv-1.0.0/bin:$PATH
USAGE
groovyclient MyScript.groovy
#!/usr/bin/env groovyclient
WRITING
SCRIPTS
RESTRICTIONS
Classname == Filename
to be found from other script
EXECUTING
SHELLCOMMANDS
"mkdir foo".execute()
["mkdir", "my directory"].execute()
WORKINGDIR&
ENVIRONMENT
"ls".execute([], new File("/tmp"))
"env".execute(["VAR1=Test", "VAR2=Something"], new File("."))
"env".execute([*:System.env,
VAR1: 'Test'].collect{ k,v -> "$k=$v" }, new File("."))
RESULTACCESS
println "ls".execute().text
println "cmd /c dir".execute().text
"ls".execute().inputStream.eachLine { println it }
"ls".execute().in.eachLine { println it }
"myCommand".execute().err.eachLine { println it }
def proc = new ProcessBuilder("myCommand").redirectErrorStream(true).start()
proc.in.eachLine { println it }
PROCESSCONTROL
Process process = "mkdir foo".execute()
process.waitFor()
int exitValue = process.exitValue()
if(!exitValue) {
//do your error-handling
}
if(!"mkdir foo".execute().waitFor()) {
//do your error-handling
}
"grep pattern".execute().waitForOrKill(1000)
def process = "myLongRunningCommand".execute()
...
process.destroy()
PROCESSOUTPUT
Process process = "myCommand".execute()
def out = new StringBuffer()
def err = new StringBuffer()
process.waitForProcessOutput( out, err )
if( out.size() > 0 ) println out
if( err.size() > 0 ) println err
def p = "rm -f foo.tmp".execute([], tmpDir)
p.consumeProcessOutput() // Prevent blocking by small buffer
p.waitFor()
PIPING
"less temp.sh".execute().pipeTo("grep Detected".execute()).text
def proc1 = "less temp.sh".execute()
def proc2 = "grep Detected".execute()
proc1 | proc2
println proc2.text
WILDCARDS
"ls *.java".execute() // won't work
"sh -c ls *.java".execute() // Shell resolves the wildcard
SHELLHELPERI
class Shell {
final Map env = System.env
File dir = new File('.')
boolean redirectErrorStream = false
long timeout = 5000
Shell env(Map env) {
this.env.putAll(env); return this
}
Shell dir(File dir) {
this.dir = dir; return this
}
Shell dir(String dir) {
this.dir = new File(dir); return this
}
Shell redirectErrorStream(boolean redirectErrorStream = true) {
this.redirectErrorStream = redirectErrorStream; return this
}
Shell timeout(int timeout = 5000) {
this.timeout = timeout; return this
}
SHELLHELPERII
Process execute(String command) {
new ProcessBuilder(['sh', '-c', command])
.directory(dir)
.redirectErrorStream(redirectErrorStream)
.environment(env.collect{k,v -> "$k=$v"} as String[])
.start()
}
int call(String command, boolean consumeOutput = true) {
Process proc = execute(command)
if(consumeOutput)
proc.consumeProcessOutput()
if(timeout)
proc.waitForOrKill(timeout)
else
proc.waitFor()
return proc.exitValue()
}
def eachLine(String command, Closure action) {
execute(command).in.eachLine(action)
}
}
SHELLHELPERIII
def shell = new Shell()
shell.call("mkdir /tmp/groovy")
shell.call("echo 123 >> /tmp/groovy/test")
shell.dir("/tmp/groovy").call("echo $HOME >> test2")
shell.eachLine("ls ."){
println "- $it -"
}
shell.eachLine("cat test2"){
println "- $it -"
}
HELPFULLSTUFF
ACCESSINGSYSTEM-VARIABLES
println System.env.PWD
ACCESSINGSYSTEM-PROPERTIES
println System.properties.'user.dir'
GETYOURPID
import java.lang.management.*
println ManagementFactory.runtimeMXBean.name.split('@').first().toInteger()
CLIBUILDER
PARSINGCOMMANDLINE
ARGUMENTS
DSL ontop of Apache Commons CLI
!#/usr/bin/env groovy
def cli = new CliBuilder(usage: 'MyScript')
cli.with {
v(longOpt: 'version', 'show version information')
}
def opt = cli.parse(args)
if (!opt)
System.exit(2)
if (opt.v) {
println "Version: 1.0.0"
}
ASAMPLE
usage: MyScript [options] [args]
-?,--help usage information
--config <arg> A script for tweaking the configuration
-D <property=value> use value for given property
-s,--source <path> Aliases for '-source'
-source <path> Specify where to find the files
-v,--version version information
THECODEI
#!/usr/bin/env groovy
def cli = new CliBuilder(usage: 'MyScript [options] [args]')
cli.with {
source (args:1, argName: 'path', optionalArg: false,
'Specify where to find the files')
_ (longOpt: 'config', args:1, argName: 'arg', optionalArg: false,
'A script for tweaking the configuration')
s (longOpt: 'source', args:1, argName:'path', optionalArg: false,
"Aliases for '-source'")
'?' (longOpt: 'help', 'usage information')
v (longOpt: 'version', 'version information')
D (args: 2, valueSeparator: '=', argName: 'property=value',
'use value for given property')
}
THECODEII
def opt = cli.parse(args)
if (!opt) // usage already displayed by cli.parse()
System.exit(2)
if(opt.'?')
cli.usage()
else if (opt.v)
println "Version: 1.0.0"
else {
if (opt.config)
println "Configuration: $opt.config"
if(opt.D) {
println "Custom properties:"
println opt.Ds.collate(2).collect{ it.join('=') }.join('n')
}
def home = System.properties.'user.dir'
if (opt.s || opt.source)
home = opt.s ?: opt.source
println "Working on files:"
opt.arguments().each println "$home/$it"
}
DEPENDENCY
MANAGEMENT
GRAPE
GROOVYADAPTABLEPACKAGINGENGINE
@Grab(group='org.springframework', module='spring-orm',
version='3.2.5.RELEASE')
import org.springframework.jdbc.core.JdbcTemplate
@Grab('org.springframework:spring-orm:3.2.5.RELEASE')
import org.springframework.jdbc.core.JdbcTemplate
Cachedirectory ~/.groovy/grape
@GRABANNOTATIONI
Annotatable everywhere
often seen at import statements
group (String)
Maven groupId or Ivy organization
module (String)
Maven artifactId or Ivy artifact
version (String)
literal
'1.1-RC3'
Ivy range
'[1.0, 2,0]' -> 1.0 or 2.0
'[2.1,)' -> 2.1 or greater
classifier (String)
'jdk15'
optional
MULTIPLEDEPENDENCIES
@Grapes([
@Grab(group='commons-primitives', module='commons-primitives',
version='1.0'),
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')
])
class Example {
...
}
REPOSITORIES
Configuration in ~/.groovy/grapeConfig.xml
Grape cache -> ~/.groovy/grapes
Maven Local -> ~/.m2/repository
JCenter (includes Maven Central)
Codehaus.org
IBiblio
Java.net
http://jcenter.bintray.com
http://repository.codehaus.org
http://www.ibiblio.org
http://download.java.net/maven/2
@GrabResolver(name='restlet', root='http://maven.restlet.org/')
@Grab(group='org.restlet', module='org.restlet', version='1.1.6')
EXCLUDETRANSITIVEDEPENDENCIES
@Grab('net.sourceforge.htmlunit:htmlunit:2.8')
@GrabExclude('xml-apis:xml-apis')
GRABCONFIG
@GrabConfig(systemClassLoader=true)
@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
GrabConfig
systemClassLoader (boolean)
using the System-ClassLoader
initContextClassLoader (boolean)
ContextClassLoader = CL of the current thread
autoDownload (boolean)
automatic downloading
disableChecksums (boolean)
checking checksums
PROXY-CONFIGURATION
$ groovy -Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port>
-Dhttp.proxyUser=<user> -Dhttp.proxyPassword=<user> yourscript.groovy
JAVA_OPTS = -Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port>
-Dhttp.proxyUser=<user> -Dhttp.proxyPassword=<user>
QUESTIONS?
Alexander (Sascha) Klein
 
codecentric AG
Curiestr. 2
70563 Stuttgart
 
tel +49.711.67400-328
mobile +49.172.5294020
alexander.klein@codecentric.de
@saschaklein
 
http://www.codecentric.de
http://blog.codecentric.de

More Related Content

PDF
Shell Script
PPT
Unix Shell Scripting Basics
PDF
Shell scripting
PDF
PDF
Interceptors: Into the Core of Pedestal
PDF
Modern Getopt for Command Line Processing in Perl
PDF
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
KEY
Sbaw091006
Shell Script
Unix Shell Scripting Basics
Shell scripting
Interceptors: Into the Core of Pedestal
Modern Getopt for Command Line Processing in Perl
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Sbaw091006

What's hot (20)

PPT
Shell Scripting
PDF
High Performance tDiary
PPT
On UnQLite
PPT
Working with databases in Perl
ODP
OpenGurukul : Language : Shell Scripting
PPTX
Shell Script Tutorial
PDF
KubeCon EU 2016: Custom Volume Plugins
PPTX
Using the Power to Prove
PDF
Augeas @RMLL 2012
PDF
PL/Perl - New Features in PostgreSQL 9.0
PDF
Créer une base NoSQL en 1 heure
KEY
Yapcasia2011 - Hello Embed Perl
PPT
Unix And Shell Scripting
PPT
Chap06
PDF
ZeroMQ Is The Answer
PDF
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
PDF
Memory Manglement in Raku
PPT
Unix Programming with Perl
KEY
Kansai.pm 10周年記念 Plack/PSGI 入門
KEY
Good Evils In Perl (Yapc Asia)
Shell Scripting
High Performance tDiary
On UnQLite
Working with databases in Perl
OpenGurukul : Language : Shell Scripting
Shell Script Tutorial
KubeCon EU 2016: Custom Volume Plugins
Using the Power to Prove
Augeas @RMLL 2012
PL/Perl - New Features in PostgreSQL 9.0
Créer une base NoSQL en 1 heure
Yapcasia2011 - Hello Embed Perl
Unix And Shell Scripting
Chap06
ZeroMQ Is The Answer
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
Memory Manglement in Raku
Unix Programming with Perl
Kansai.pm 10周年記念 Plack/PSGI 入門
Good Evils In Perl (Yapc Asia)
Ad

Similar to Groovy on the Shell (20)

PDF
Configuration Surgery with Augeas
PDF
Vagrant for real
PPTX
How Secure Are Docker Containers?
PPTX
Introducing PHP Latest Updates
PPT
2007 09 10 Fzi Training Groovy Grails V Ws
PPTX
Perl basics for Pentesters
PDF
ELK: a log management framework
PDF
Im trying to run make qemu-nox In a putty terminal but it.pdf
PDF
DEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destruction
PDF
deepjs - tools for better programming
PDF
Apache Hadoop Shell Rewrite
PDF
Jakob Holderbaum - Managing Shared secrets using basic Unix tools
PDF
PHP Backdoor: The rise of the vuln
PDF
Gazelle - Plack Handler for performance freaks #yokohamapm
PDF
Hadoop spark performance comparison
PDF
Vagrant for real
PDF
Vagrant for real (codemotion rome 2016)
PDF
Alexander Reelsen - Seccomp for Developers
KEY
JavaScript Growing Up
PDF
Security Challenges in Node.js
Configuration Surgery with Augeas
Vagrant for real
How Secure Are Docker Containers?
Introducing PHP Latest Updates
2007 09 10 Fzi Training Groovy Grails V Ws
Perl basics for Pentesters
ELK: a log management framework
Im trying to run make qemu-nox In a putty terminal but it.pdf
DEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destruction
deepjs - tools for better programming
Apache Hadoop Shell Rewrite
Jakob Holderbaum - Managing Shared secrets using basic Unix tools
PHP Backdoor: The rise of the vuln
Gazelle - Plack Handler for performance freaks #yokohamapm
Hadoop spark performance comparison
Vagrant for real
Vagrant for real (codemotion rome 2016)
Alexander Reelsen - Seccomp for Developers
JavaScript Growing Up
Security Challenges in Node.js
Ad

More from sascha_klein (10)

PDF
DSL101
PDF
Groovy on the shell
PDF
GroovyFX - groove JavaFX Gr8Conf EU 2017
PDF
Bob the Builder - Gr8Conf EU 2017
PDF
GroovyFX - Groove JavaFX
PDF
Using Groovy with Jenkins
PDF
Introduction to Graphics- and UI-Design
PDF
Android on Groovy
PDF
Groovy on the shell
PDF
Vert.x using Groovy - Simplifying non-blocking code
DSL101
Groovy on the shell
GroovyFX - groove JavaFX Gr8Conf EU 2017
Bob the Builder - Gr8Conf EU 2017
GroovyFX - Groove JavaFX
Using Groovy with Jenkins
Introduction to Graphics- and UI-Design
Android on Groovy
Groovy on the shell
Vert.x using Groovy - Simplifying non-blocking code

Recently uploaded (20)

PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
medical staffing services at VALiNTRY
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
L1 - Introduction to python Backend.pptx
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
System and Network Administration Chapter 2
PDF
Digital Strategies for Manufacturing Companies
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
history of c programming in notes for students .pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
wealthsignaloriginal-com-DS-text-... (1).pdf
How to Migrate SBCGlobal Email to Yahoo Easily
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
medical staffing services at VALiNTRY
Odoo POS Development Services by CandidRoot Solutions
L1 - Introduction to python Backend.pptx
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Wondershare Filmora 15 Crack With Activation Key [2025
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
VVF-Customer-Presentation2025-Ver1.9.pptx
2025 Textile ERP Trends: SAP, Odoo & Oracle
Internet Downloader Manager (IDM) Crack 6.42 Build 41
System and Network Administration Chapter 2
Digital Strategies for Manufacturing Companies
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Which alternative to Crystal Reports is best for small or large businesses.pdf
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
history of c programming in notes for students .pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)

Groovy on the Shell