SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Unleash your inner
console cowboy
Kenneth Geisshirt
kg@realm.io
Realm Inc.
@realm
http://github.com/Realm/
http://realm.io/
Ivan Constantin, https://www.flickr.com/photos/ivan70s/
Today’s goal
• Present bash as a productivity tool
• stop using the mouse 🐁
• Write scripts to automate your work
• Begin to use advanced tools in your daily work
Become a console cowboy
Agenda
• The terminal and the
shell
• Basic usage of bash
• Living on the
command-line
• Useful utilities
• Scripting
• Home brew
• Tools for developers
• git
• Xcode
• Cocoapods
The shell
Which terminal?
• iTerm2 is much better
• Easier to change tab (⌘ left
+ right, CTRL+TAB)
• Change Desktop navigation
to ⌥ left + right
• Add CTRL left + right to
iTerm2 preferences
• Keeps SSH connection alive
• http://iterm2.com/
Which shell?
OS X comes with many shells
➤ bash, csh, ksh, sh, tcsh, and zsh
Parée, https://www.flickr.com/photos/pareeerica/
Since 10.3, bash has been the default shell
OS X 10.9.4 carries bash 3.2.51 (2010-03-17)
Stephen R. Bourne (Bell lab) introduced the
shell to UNIX in 1977
Home brew has many great bash related packages
Redirection
UNIX idioms
• a tool should do one thing
but do it well
• text is the universal data
format
}Output of one utility is input for the next
Bash implements redirection:
• stdout to file: >
• stdin from file <
• append stdout to file: >>
• stderr to stdout: 2>&1
Examples:
echo “Hello” > hello
cat < hello
echo “World” >> hello
clang notfound.m > error 2>&1
Pipes
• Introduced to UNIX by Douglas
McIlroy in 1973
• Pipes are the glue in UNIX
component based programming (aka
shell scripting)
• Powerful idiom for stream processing
• The character | is used by all known
shells
Examples
lsof | grep ^Keynote | wc -l
ifconfig | grep -e ^[a-z] | cut -f1 -d:
"Pipeline" by TyIzaeL - Licensed under Public domain via Wikimedia Commons
http://commons.wikimedia.org/wiki/File:Pipeline.svg#mediaviewer/File:Pipeline.svg
Configuration
• $HOME/.bash_profile and $HOME/.bashrc
are your personal configuration
• alias - useful for often used options
• Setting prompt (PS1) and search path (PATH)
• Reload configuration: source ~/.bash_profile
See my .bash_profile at the end
Keyboard short-cuts
• Bash uses Emacs bindings by default 😄
(help bind for details)
Movement
• CTRL-a beginning of line
• CTRL-e end of line
• CTRL-← One word left
• CTRL-→ One word right
Cut-n-paste
• CTRL-space mark
• ␛🔙 Delete word
• CTRL-d Delete character
• CTRL-_ undo
• CTRL-k delete until end
of line
• CTRL-y yank from kill-
ring
Request
a
dem
o
Remap CTRL-←/→
History
• Bash stores your command history
• history - show latest commands
• !! - run last command
• !number - run command number again
• CTRL-r - search in history
• Exclude commands from history:
• export HISTIGNORE=“pwd:ls:ls -l:cd”
Completion
• Use TAB to let Bash complete as much as possible
• Use TAB+TAB to show possible completions
• Bash has programmable completion → you can
specify what Bash does
• Large collections of completion recipes exist (home
brew is your friend)
Request
a
dem
o
Living on the command-line
• cd - - go back to previous folder
• file file - guess file content (magic numbers)
• lsof - list open files
• ps (aux or -ef) and top - show processes
• Simple watch:
while true ; do clear ; command ; sleep
n ; done
OS X specific commands
• open file - Starts registered program and open file
• say “Hello world” - speech synthesis (download
extra voices/languages in System preferences)
• ls | pbcopy - copy stdin to paste board
• pbpaste - paste to stdout
• dns-sd -B _ssh._tcp - show Bonjour enabled SSH
hosts
Useful utilities
Find files: find . -name ‘*.o’ -delete
Patterns: grep -r list *
Cut field: cut -f1,3 -d: /etc/passwd
Word count: wc -l *.cpp
Transform: tr “ “ “_” < README.org
Sort lines: sort -t: -n -r -k 4 /etc/passwd
Last lines: tail /etc/passwd
First lines: head /etc/passwd
Request
a
dem
o
sed - the stream editor
• sed is used to edit files non-
interactively
• Option -E gives an editing (regular)
expression
• s/FISH/HORSE/g - substitute
• /FISH/d - delete lines
joinash, https://www.flickr.com/photos/joinash/
Option -i is tricky:
• GNU sed has optional extension
• BSD sed requires extension (‘’ is useful)
Request
a
dem
o
awk - a processing tool
• awk is a programming
language by itself
• Matching lines are
processed
• line is split in fields
(spaces are default)
Example: adding.sh
Patterns:
BEGIN - before opening file
END - after closing file
A. Aho, P. Weinberger, B. Kernighan
Scripting
Examples can
be found as
last slides
Bash for programmers
• Bash is a complete programming language
• Shell scripts grow and become ugly 😞
• Execution:
• sh script.sh
• chmod +x script.sh; ./script.sh
• Interpreted language → slow
Basic syntax
• White spaces: space and
tab
• Comments: # and to end-
of-line
• Statements: either end-
of-line of ; (semicolon)
• Variables and functions:
Letters, digits and
underscore
#!/bin/bash
# Monte Carlo calculation of pi
NSTEPS=500
NHITS=0
i=0
while [ $i -lt $NSTEPS ]; do
x=$(echo $RANDOM/32767 | bc -l)
y=$(echo $RANDOM/32767 | bc -l)
d=$(echo "sqrt($x*$x+$y*$y) < 1.0" | bc -l)
if [ $d -eq 1 ]; then
NHITS=$(($NHITS + 1))
fi
i=$(($i + 1))
done
PI=$(echo "4.0*$NHITS/$NSTEPS" | bc -l)
echo "PI = $PI"
Example: pi.sh
Variables• Case-sensitive names
• No declarations, no types
• Strings: “…” are substituted; ‘…’ are not
• Assignment (=): no spaces!
• $(…) assignment from stdout including
spaces
• I often use awk ‘{print $1}’ to
remove spaces
• $((…)) arithmetic
• $varname - value of variable varname
Example: variables.sh
Built-in variables:
• $# is the number of argument
• $1, $2, … are the arguments
• $$ is the process ID
• $? is exit code of last command
Branches
• Simple branching with if then
else fi
• Enclose condition with []
• elif is possible, too
• Use case in esac when you
can many cases and single
condition
String operators:
-z is empty?
-d is directory?
-f is file?
== equal to
!= not equal to
Integer operators:
-eq equal to
-lt less than
-ne not equal to
-gt greater than
Example: branches.sh
Loops
• Simple loops: for … in … ; do …
done
• The seq utility can generate list of
numbers
• Conditional loops: while … ; do …
done
• Line-by-line: while read line ;
do … done
Example: loops.sh
One-liner (similar to watch)
while [ true ]; do
clear;
echo $RANDOM;
sleep 1;
done
Functions
• Functions can increase readability of your scripts
• arguments are $1, $2, …
• local variables can be used
• return an integer and get it as $?
• Use global variable to return a string 😒
Example: functions.sh
Tips and tricks
• Use set -e to exit early
• or use || exit 1
• set -O pipefail and you can get the exit code of the
first failing program in a pipe
• xcpretty never fails but xcodebuild might
• Use tee to write to stdout and file
• To trace (debugging): set -x or sh -x
Tips and tricks
• Always use “$var” when dealing with file names (and strings)
• str=“fish horse”; for i in $str; do echo $i; done
• str=“fish horse”; for i in “$str”; do echo $i; done
• Call mkdir -p when creating folders
• Create temp. files with mktemp /tmp/$$.XXXXXX
• Using variable to modify behaviour of script:
• FLAGS=“-O3 -libc++=stdlibc++” build.sh
• Subshells: (cd foo && rm -f bar)
Tool for
developers
Home brew
• Home brew provides calories for
console cowboys
• You don’t have to be root to install
• Software is installed in /usr/
local/Cellar, and symlinked to /
usr/local/bin
• Brew cask is for binary distribution
• http://brew.sh and http://
caskroom.io
Greg Peverill-Conti, https://www.flickr.com/photos/gregpc/
Examples:
brew search bash
brew info bash
brew install bash
brew update
Tools for developers
• Apple provides some basic tools
• nm - display symbol table
• c++filt - Prettify C++ and Java names
• otool -L - display which shared libraries are
required
• libtool - create libraries
• lipo - manipulate fat/universal binaries
zzpza, https://www.flickr.com/photos/zzpza/
Examples:
nm book.o | c++filt
otool -L RealmInspector
git
• Home brew packages:
• git, git-extras
• Symlink /usr/local/bin/git to /
usr/bin
• Bash completion works
• commands, branches, etc.
• Fancy prompt:
PS1='u@h:w$(__git_ps1 " (%s)") $ ‘
git log --graph --simplify-by-decoration --pretty=format:'%d' --all
Examples:
git count -all
git contrib "Kenneth Geisshirt"
Xcode
• You can build Xcode projects at the
command-line
xcodebuild -scheme SpainPlain -
configuration Release -sdk
iphonesimulator
• Targets: clean, build, test
• You can add shell scripts to build phases
xcpretty
• The output of xcodebuild can be hard to read
• xcpretty makes it prettier
• Installation:
• sudo gem install xcpretty
• Usage:
• xbuildcode … | xcpretty
xctool
• Yet another build helper
• Installation:
• brew install xctool
• Usage:
• xctool -scheme SpainPlain -
configuration Release -sdk
iphonesimulator build
Cocoapods
• Dependency and build system for iOS and OS X developers
• Installation:
• sudo gem install cocoapods
• Usage
• Create a new Xcode project and quit Xcode
• Edit Podfile and run pod install
• Open workspace in Xcode
• http://cocoapods.org
Further information
• Classical Shell Scripting. R. Arnolds and N.H.F.
Beebe. O’Reilly Media, 2005.
• The sed FAQ: http://sed.sourceforge.net/
sedfaq.html
• Advanced Bash-Scripting Guide: http://
www.tldp.org/LDP/abs/html/
http://realm
.io
W
e
are
hiring
varriables.sh
#!/bin/bash
message_1="Hello"
message_2="World"
message="$message_1 $message_2"
echo $message
nusers=$(grep -v ^# /etc/passwd | wc -l | awk '{print $1}')
echo "Number of users: $nusers"
answer=$((6*7))
echo "The life, the universe, and everything: $answer"
Files
.bash_profile
# Ignore a few commands in history
export HISTIGNORE="pwd:ls:ls -l:cd"
# don't put duplicate lines in the history. See bash(1) for more options
# don't overwrite GNU Midnight Commander's setting of `ignorespace'.
HISTCONTROL=$HISTCONTROL${HISTCONTROL+:}ignoredups
# ... or force ignoredups and ignorespace
HISTCONTROL=ignoreboth
# Bash completion
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
if [ -f $(brew --prefix)/share/bash-completion/bash_completion ]; then
. $(brew --prefix)/share/bash-completion/bash_completion
fi
# Prompt - including git
PS1='u@h:w$(__git_ps1 " (%s)") $ '
.bash_profile - con’t
# Color ls etc.
alias ls="ls -G"
alias ll="ls -l"
alias fuck='sudo $(history -p !!)' # rerun as root
# Building
export MAKEFLAGS=-j4
# LejOS
export NXJ_HOME=$HOME/local/leJOS_NXJ_0.9.1beta-3
export PATH=$PATH:$NXJ_HOME/bin
adding.sh
#!/bin/bash
tmpfile="$(mktemp /tmp/$$.XXXXXX)"
for i in $(seq 1 20); do
echo $RANDOM >> "$tmpfile"
done
awk 'BEGIN {total=0 } END { print total } { total+=$1 }' $tmpfile
rm -f "$tmpfile"
branches.sh
#!/bin/bash
if [ -z "$1" ]; then
name="Arthur"
else
name="$1"
fi
if [ "$name" != "Arthur" ]; then
echo "Not Arthur"
else
echo "Hello Arthur"
fi
answer=$((6*7))
if [ $answer -eq 42 ]; then
echo "Life, the universe,
and everything"
fi
branshes.sh - con’t
case "$name" in
"Arthur")
echo "Welcome onboard"
;;
"Trillian")
echo "You know Arthur"
;;
*)
echo "Who are you?"
;;
esac
loops.sh#!/bin/bash
# Multiplication table
for i in $(seq 1 10); do
echo "$i $((3*$i))"
done
# All .sh files
for f in $(ls *.sh); do
echo "$f $(head -1 $f | cut -c3-) $(wc -l $f | awk '{print $1}')"
done
# read self lile-by-line
i=1
cat $0 | while read line ; do
nchars=$(echo "$line" | wc -c | awk '{print $1}')
echo "$i $nchars"
i=$(($i+1))
done | sort -n -k 2
report.text
This is a test test.
I can change it.
A test of sed is about to happen.

Contenu connexe

Tendances

Unix Shell Scripting
Unix Shell ScriptingUnix Shell Scripting
Unix Shell Scripting
Mustafa Qasim
 

Tendances (20)

Linux basics by Raj Miraje
Linux basics by Raj MirajeLinux basics by Raj Miraje
Linux basics by Raj Miraje
 
Introduction to shell scripting
Introduction to shell scriptingIntroduction to shell scripting
Introduction to shell scripting
 
并发模型介绍
并发模型介绍并发模型介绍
并发模型介绍
 
Introduction to Bash Scripting, Zyxware Technologies, CSI Students Convention...
Introduction to Bash Scripting, Zyxware Technologies, CSI Students Convention...Introduction to Bash Scripting, Zyxware Technologies, CSI Students Convention...
Introduction to Bash Scripting, Zyxware Technologies, CSI Students Convention...
 
Bash Shell Scripting
Bash Shell ScriptingBash Shell Scripting
Bash Shell Scripting
 
OpenGurukul : Language : Shell Scripting
OpenGurukul : Language : Shell ScriptingOpenGurukul : Language : Shell Scripting
OpenGurukul : Language : Shell Scripting
 
Shell Scripting
Shell ScriptingShell Scripting
Shell Scripting
 
Shell scripting
Shell scriptingShell scripting
Shell scripting
 
Shell basic
Shell basicShell basic
Shell basic
 
Easiest way to start with Shell scripting
Easiest way to start with Shell scriptingEasiest way to start with Shell scripting
Easiest way to start with Shell scripting
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
 
Configuration surgery with Augeas (OggCamp 12)
Configuration surgery with Augeas (OggCamp 12)Configuration surgery with Augeas (OggCamp 12)
Configuration surgery with Augeas (OggCamp 12)
 
Discover Dart - Meetup 15/02/2017
Discover Dart - Meetup 15/02/2017Discover Dart - Meetup 15/02/2017
Discover Dart - Meetup 15/02/2017
 
Slides
SlidesSlides
Slides
 
Groovy on the Shell
Groovy on the ShellGroovy on the Shell
Groovy on the Shell
 
Shell Script
Shell ScriptShell Script
Shell Script
 
Unix Shell Scripting
Unix Shell ScriptingUnix Shell Scripting
Unix Shell Scripting
 
CPAN 模組二三事
CPAN 模組二三事CPAN 模組二三事
CPAN 模組二三事
 
My life as a beekeeper
My life as a beekeeperMy life as a beekeeper
My life as a beekeeper
 
KubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume PluginsKubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume Plugins
 

Similaire à Unleash your inner console cowboy

Unix fundamentals and_shell scripting
Unix fundamentals and_shell scriptingUnix fundamentals and_shell scripting
Unix fundamentals and_shell scripting
Ganesh Bhosale
 
DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foo
brian_dailey
 
Lex tool manual
Lex tool manualLex tool manual
Lex tool manual
Sami Said
 
Bash shell
Bash shellBash shell
Bash shell
xylas121
 

Similaire à Unleash your inner console cowboy (20)

Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboy
 
Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboy
 
Programming in Linux Environment
Programming in Linux EnvironmentProgramming in Linux Environment
Programming in Linux Environment
 
JIP Pipeline System Introduction
JIP Pipeline System IntroductionJIP Pipeline System Introduction
JIP Pipeline System Introduction
 
Ultimate Unix Meetup Presentation
Ultimate Unix Meetup PresentationUltimate Unix Meetup Presentation
Ultimate Unix Meetup Presentation
 
Gun make
Gun makeGun make
Gun make
 
One-Liners to Rule Them All
One-Liners to Rule Them AllOne-Liners to Rule Them All
One-Liners to Rule Them All
 
NYPHP March 2009 Presentation
NYPHP March 2009 PresentationNYPHP March 2009 Presentation
NYPHP March 2009 Presentation
 
Unix fundamentals and_shell scripting
Unix fundamentals and_shell scriptingUnix fundamentals and_shell scripting
Unix fundamentals and_shell scripting
 
Lpt lopsa
Lpt lopsaLpt lopsa
Lpt lopsa
 
Lets make better scripts
Lets make better scriptsLets make better scripts
Lets make better scripts
 
Shell scripting
Shell scriptingShell scripting
Shell scripting
 
Introduction to linux
Introduction to linuxIntroduction to linux
Introduction to linux
 
DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foo
 
Bash is not a second zone citizen programming language
Bash is not a second zone citizen programming languageBash is not a second zone citizen programming language
Bash is not a second zone citizen programming language
 
LINUX_admin_commands.pptx
LINUX_admin_commands.pptxLINUX_admin_commands.pptx
LINUX_admin_commands.pptx
 
Lex tool manual
Lex tool manualLex tool manual
Lex tool manual
 
Linux CLI
Linux CLILinux CLI
Linux CLI
 
Bash shell
Bash shellBash shell
Bash shell
 
Linux Shell Scripting Craftsmanship
Linux Shell Scripting CraftsmanshipLinux Shell Scripting Craftsmanship
Linux Shell Scripting Craftsmanship
 

Plus de Kenneth Geisshirt

Naturvidenskabsfestival 2012
Naturvidenskabsfestival 2012Naturvidenskabsfestival 2012
Naturvidenskabsfestival 2012
Kenneth Geisshirt
 
JavaScript/Emacs integration
JavaScript/Emacs integrationJavaScript/Emacs integration
JavaScript/Emacs integration
Kenneth Geisshirt
 

Plus de Kenneth Geisshirt (17)

Building parsers in JavaScript
Building parsers in JavaScriptBuilding parsers in JavaScript
Building parsers in JavaScript
 
Open Source in Real Life
Open Source in Real LifeOpen Source in Real Life
Open Source in Real Life
 
Building mobile apps with Realm for React Native
Building mobile apps with Realm for React NativeBuilding mobile apps with Realm for React Native
Building mobile apps with Realm for React Native
 
micro:bit and JavaScript
micro:bit and JavaScriptmicro:bit and JavaScript
micro:bit and JavaScript
 
Tales from the dark side: developing SDKs at scale
Tales from the dark side: developing SDKs at scaleTales from the dark side: developing SDKs at scale
Tales from the dark side: developing SDKs at scale
 
Android things
Android thingsAndroid things
Android things
 
Node.js extensions in C++
Node.js extensions in C++Node.js extensions in C++
Node.js extensions in C++
 
Tips and tricks for building high performance android apps using native code
Tips and tricks for building high performance android apps using native codeTips and tricks for building high performance android apps using native code
Tips and tricks for building high performance android apps using native code
 
Is the database a solved problem?
Is the database a solved problem?Is the database a solved problem?
Is the database a solved problem?
 
Extending Node.js using C++
Extending Node.js using C++Extending Node.js using C++
Extending Node.js using C++
 
Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++
 
Sociale netværk
Sociale netværkSociale netværk
Sociale netværk
 
Naturvidenskabsfestival 2012
Naturvidenskabsfestival 2012Naturvidenskabsfestival 2012
Naturvidenskabsfestival 2012
 
Hadoop - the data scientist's toolbox
Hadoop - the data scientist's toolboxHadoop - the data scientist's toolbox
Hadoop - the data scientist's toolbox
 
JavaScript/Emacs integration
JavaScript/Emacs integrationJavaScript/Emacs integration
JavaScript/Emacs integration
 
Introduction to JavaScript for Modern Software Development
Introduction to JavaScript for Modern Software DevelopmentIntroduction to JavaScript for Modern Software Development
Introduction to JavaScript for Modern Software Development
 
Kendthed og vigtighed
Kendthed og vigtighedKendthed og vigtighed
Kendthed og vigtighed
 

Dernier

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 

Dernier (20)

Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 

Unleash your inner console cowboy

  • 1. Unleash your inner console cowboy Kenneth Geisshirt kg@realm.io Realm Inc. @realm http://github.com/Realm/ http://realm.io/ Ivan Constantin, https://www.flickr.com/photos/ivan70s/
  • 2. Today’s goal • Present bash as a productivity tool • stop using the mouse 🐁 • Write scripts to automate your work • Begin to use advanced tools in your daily work Become a console cowboy
  • 3. Agenda • The terminal and the shell • Basic usage of bash • Living on the command-line • Useful utilities • Scripting • Home brew • Tools for developers • git • Xcode • Cocoapods
  • 5. Which terminal? • iTerm2 is much better • Easier to change tab (⌘ left + right, CTRL+TAB) • Change Desktop navigation to ⌥ left + right • Add CTRL left + right to iTerm2 preferences • Keeps SSH connection alive • http://iterm2.com/
  • 6. Which shell? OS X comes with many shells ➤ bash, csh, ksh, sh, tcsh, and zsh Parée, https://www.flickr.com/photos/pareeerica/ Since 10.3, bash has been the default shell OS X 10.9.4 carries bash 3.2.51 (2010-03-17) Stephen R. Bourne (Bell lab) introduced the shell to UNIX in 1977 Home brew has many great bash related packages
  • 7. Redirection UNIX idioms • a tool should do one thing but do it well • text is the universal data format }Output of one utility is input for the next Bash implements redirection: • stdout to file: > • stdin from file < • append stdout to file: >> • stderr to stdout: 2>&1 Examples: echo “Hello” > hello cat < hello echo “World” >> hello clang notfound.m > error 2>&1
  • 8. Pipes • Introduced to UNIX by Douglas McIlroy in 1973 • Pipes are the glue in UNIX component based programming (aka shell scripting) • Powerful idiom for stream processing • The character | is used by all known shells Examples lsof | grep ^Keynote | wc -l ifconfig | grep -e ^[a-z] | cut -f1 -d: "Pipeline" by TyIzaeL - Licensed under Public domain via Wikimedia Commons http://commons.wikimedia.org/wiki/File:Pipeline.svg#mediaviewer/File:Pipeline.svg
  • 9. Configuration • $HOME/.bash_profile and $HOME/.bashrc are your personal configuration • alias - useful for often used options • Setting prompt (PS1) and search path (PATH) • Reload configuration: source ~/.bash_profile See my .bash_profile at the end
  • 10. Keyboard short-cuts • Bash uses Emacs bindings by default 😄 (help bind for details) Movement • CTRL-a beginning of line • CTRL-e end of line • CTRL-← One word left • CTRL-→ One word right Cut-n-paste • CTRL-space mark • ␛🔙 Delete word • CTRL-d Delete character • CTRL-_ undo • CTRL-k delete until end of line • CTRL-y yank from kill- ring Request a dem o Remap CTRL-←/→
  • 11. History • Bash stores your command history • history - show latest commands • !! - run last command • !number - run command number again • CTRL-r - search in history • Exclude commands from history: • export HISTIGNORE=“pwd:ls:ls -l:cd”
  • 12. Completion • Use TAB to let Bash complete as much as possible • Use TAB+TAB to show possible completions • Bash has programmable completion → you can specify what Bash does • Large collections of completion recipes exist (home brew is your friend) Request a dem o
  • 13. Living on the command-line • cd - - go back to previous folder • file file - guess file content (magic numbers) • lsof - list open files • ps (aux or -ef) and top - show processes • Simple watch: while true ; do clear ; command ; sleep n ; done
  • 14. OS X specific commands • open file - Starts registered program and open file • say “Hello world” - speech synthesis (download extra voices/languages in System preferences) • ls | pbcopy - copy stdin to paste board • pbpaste - paste to stdout • dns-sd -B _ssh._tcp - show Bonjour enabled SSH hosts
  • 15. Useful utilities Find files: find . -name ‘*.o’ -delete Patterns: grep -r list * Cut field: cut -f1,3 -d: /etc/passwd Word count: wc -l *.cpp Transform: tr “ “ “_” < README.org Sort lines: sort -t: -n -r -k 4 /etc/passwd Last lines: tail /etc/passwd First lines: head /etc/passwd Request a dem o
  • 16. sed - the stream editor • sed is used to edit files non- interactively • Option -E gives an editing (regular) expression • s/FISH/HORSE/g - substitute • /FISH/d - delete lines joinash, https://www.flickr.com/photos/joinash/ Option -i is tricky: • GNU sed has optional extension • BSD sed requires extension (‘’ is useful) Request a dem o
  • 17. awk - a processing tool • awk is a programming language by itself • Matching lines are processed • line is split in fields (spaces are default) Example: adding.sh Patterns: BEGIN - before opening file END - after closing file A. Aho, P. Weinberger, B. Kernighan
  • 19. Bash for programmers • Bash is a complete programming language • Shell scripts grow and become ugly 😞 • Execution: • sh script.sh • chmod +x script.sh; ./script.sh • Interpreted language → slow
  • 20. Basic syntax • White spaces: space and tab • Comments: # and to end- of-line • Statements: either end- of-line of ; (semicolon) • Variables and functions: Letters, digits and underscore #!/bin/bash # Monte Carlo calculation of pi NSTEPS=500 NHITS=0 i=0 while [ $i -lt $NSTEPS ]; do x=$(echo $RANDOM/32767 | bc -l) y=$(echo $RANDOM/32767 | bc -l) d=$(echo "sqrt($x*$x+$y*$y) < 1.0" | bc -l) if [ $d -eq 1 ]; then NHITS=$(($NHITS + 1)) fi i=$(($i + 1)) done PI=$(echo "4.0*$NHITS/$NSTEPS" | bc -l) echo "PI = $PI" Example: pi.sh
  • 21. Variables• Case-sensitive names • No declarations, no types • Strings: “…” are substituted; ‘…’ are not • Assignment (=): no spaces! • $(…) assignment from stdout including spaces • I often use awk ‘{print $1}’ to remove spaces • $((…)) arithmetic • $varname - value of variable varname Example: variables.sh Built-in variables: • $# is the number of argument • $1, $2, … are the arguments • $$ is the process ID • $? is exit code of last command
  • 22. Branches • Simple branching with if then else fi • Enclose condition with [] • elif is possible, too • Use case in esac when you can many cases and single condition String operators: -z is empty? -d is directory? -f is file? == equal to != not equal to Integer operators: -eq equal to -lt less than -ne not equal to -gt greater than Example: branches.sh
  • 23. Loops • Simple loops: for … in … ; do … done • The seq utility can generate list of numbers • Conditional loops: while … ; do … done • Line-by-line: while read line ; do … done Example: loops.sh One-liner (similar to watch) while [ true ]; do clear; echo $RANDOM; sleep 1; done
  • 24. Functions • Functions can increase readability of your scripts • arguments are $1, $2, … • local variables can be used • return an integer and get it as $? • Use global variable to return a string 😒 Example: functions.sh
  • 25. Tips and tricks • Use set -e to exit early • or use || exit 1 • set -O pipefail and you can get the exit code of the first failing program in a pipe • xcpretty never fails but xcodebuild might • Use tee to write to stdout and file • To trace (debugging): set -x or sh -x
  • 26. Tips and tricks • Always use “$var” when dealing with file names (and strings) • str=“fish horse”; for i in $str; do echo $i; done • str=“fish horse”; for i in “$str”; do echo $i; done • Call mkdir -p when creating folders • Create temp. files with mktemp /tmp/$$.XXXXXX • Using variable to modify behaviour of script: • FLAGS=“-O3 -libc++=stdlibc++” build.sh • Subshells: (cd foo && rm -f bar)
  • 28. Home brew • Home brew provides calories for console cowboys • You don’t have to be root to install • Software is installed in /usr/ local/Cellar, and symlinked to / usr/local/bin • Brew cask is for binary distribution • http://brew.sh and http:// caskroom.io Greg Peverill-Conti, https://www.flickr.com/photos/gregpc/ Examples: brew search bash brew info bash brew install bash brew update
  • 29. Tools for developers • Apple provides some basic tools • nm - display symbol table • c++filt - Prettify C++ and Java names • otool -L - display which shared libraries are required • libtool - create libraries • lipo - manipulate fat/universal binaries zzpza, https://www.flickr.com/photos/zzpza/ Examples: nm book.o | c++filt otool -L RealmInspector
  • 30. git • Home brew packages: • git, git-extras • Symlink /usr/local/bin/git to / usr/bin • Bash completion works • commands, branches, etc. • Fancy prompt: PS1='u@h:w$(__git_ps1 " (%s)") $ ‘ git log --graph --simplify-by-decoration --pretty=format:'%d' --all Examples: git count -all git contrib "Kenneth Geisshirt"
  • 31. Xcode • You can build Xcode projects at the command-line xcodebuild -scheme SpainPlain - configuration Release -sdk iphonesimulator • Targets: clean, build, test • You can add shell scripts to build phases
  • 32. xcpretty • The output of xcodebuild can be hard to read • xcpretty makes it prettier • Installation: • sudo gem install xcpretty • Usage: • xbuildcode … | xcpretty
  • 33. xctool • Yet another build helper • Installation: • brew install xctool • Usage: • xctool -scheme SpainPlain - configuration Release -sdk iphonesimulator build
  • 34. Cocoapods • Dependency and build system for iOS and OS X developers • Installation: • sudo gem install cocoapods • Usage • Create a new Xcode project and quit Xcode • Edit Podfile and run pod install • Open workspace in Xcode • http://cocoapods.org
  • 35. Further information • Classical Shell Scripting. R. Arnolds and N.H.F. Beebe. O’Reilly Media, 2005. • The sed FAQ: http://sed.sourceforge.net/ sedfaq.html • Advanced Bash-Scripting Guide: http:// www.tldp.org/LDP/abs/html/ http://realm .io W e are hiring
  • 36. varriables.sh #!/bin/bash message_1="Hello" message_2="World" message="$message_1 $message_2" echo $message nusers=$(grep -v ^# /etc/passwd | wc -l | awk '{print $1}') echo "Number of users: $nusers" answer=$((6*7)) echo "The life, the universe, and everything: $answer"
  • 37. Files
  • 38. .bash_profile # Ignore a few commands in history export HISTIGNORE="pwd:ls:ls -l:cd" # don't put duplicate lines in the history. See bash(1) for more options # don't overwrite GNU Midnight Commander's setting of `ignorespace'. HISTCONTROL=$HISTCONTROL${HISTCONTROL+:}ignoredups # ... or force ignoredups and ignorespace HISTCONTROL=ignoreboth # Bash completion if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi if [ -f $(brew --prefix)/share/bash-completion/bash_completion ]; then . $(brew --prefix)/share/bash-completion/bash_completion fi # Prompt - including git PS1='u@h:w$(__git_ps1 " (%s)") $ '
  • 39. .bash_profile - con’t # Color ls etc. alias ls="ls -G" alias ll="ls -l" alias fuck='sudo $(history -p !!)' # rerun as root # Building export MAKEFLAGS=-j4 # LejOS export NXJ_HOME=$HOME/local/leJOS_NXJ_0.9.1beta-3 export PATH=$PATH:$NXJ_HOME/bin
  • 40. adding.sh #!/bin/bash tmpfile="$(mktemp /tmp/$$.XXXXXX)" for i in $(seq 1 20); do echo $RANDOM >> "$tmpfile" done awk 'BEGIN {total=0 } END { print total } { total+=$1 }' $tmpfile rm -f "$tmpfile"
  • 41. branches.sh #!/bin/bash if [ -z "$1" ]; then name="Arthur" else name="$1" fi if [ "$name" != "Arthur" ]; then echo "Not Arthur" else echo "Hello Arthur" fi answer=$((6*7)) if [ $answer -eq 42 ]; then echo "Life, the universe, and everything" fi
  • 42. branshes.sh - con’t case "$name" in "Arthur") echo "Welcome onboard" ;; "Trillian") echo "You know Arthur" ;; *) echo "Who are you?" ;; esac
  • 43. loops.sh#!/bin/bash # Multiplication table for i in $(seq 1 10); do echo "$i $((3*$i))" done # All .sh files for f in $(ls *.sh); do echo "$f $(head -1 $f | cut -c3-) $(wc -l $f | awk '{print $1}')" done # read self lile-by-line i=1 cat $0 | while read line ; do nchars=$(echo "$line" | wc -c | awk '{print $1}') echo "$i $nchars" i=$(($i+1)) done | sort -n -k 2
  • 44. report.text This is a test test. I can change it. A test of sed is about to happen.