Skip to content
Guard::Shell automatically runs shell commands when watched files are modified.
Find file
Latest commit 0a8e1f5 Dec 8, 2014 @hawx v0.7.1
Failed to load latest commit information.
lib/guard v0.7.1 Dec 8, 2014
spec add specs Dec 7, 2014
.gitignore ignore Gemfile.lock Dec 7, 2014
.rspec add basic rspec setup Dec 7, 2014
Gemfile add basic rspec setup Dec 7, 2014
LICENSE Initial commit Oct 16, 2010
Rakefile add basic rspec setup Dec 7, 2014 README mistyped quote fix. Closes #6 Mar 15, 2012
guard-shell.gemspec use guard-compat Dec 7, 2014


This little guard allows you to run shell commands when files are altered.


Make sure you have guard installed.

Install the gem with:

gem install guard-shell

Or add it to your Gemfile:

gem 'guard-shell'

And then add a basic setup to your Guardfile:

guard init shell


If you can do something in your shell, or in ruby, you can do it when a file changes with guard-shell. It simply executes the block passed to watch if a change is detected, and if anything is returned from the block it will be printed. For example

guard :shell do
  watch /.*/ do |m|
    m[0] + " has changed."

will simply print a message telling you a file has been changed when it is changed. This admittedly isn't a very useful example, but you hopefully get the idea. To run everything on start pass :all_on_start to #guard,

guard :shell, :all_on_start => true do
  # ...

There is also a shortcut for easily creating notifications,

guard :shell do
  watch /.*/ do |m|
    n m[0], 'File Changed'

#n takes up to three arguments; the first is the body of the message, here the path of the changed file; the second is the title for the notification; and the third is the image to use. There are three (four counting nil the default) different images that can be specified :success, :pending and :failed.


Saying the Name of the File You Changed and Displaying a Notification

guard :shell do
  watch /(.*)/ do |m|
    n m[0], 'Changed'
    `say -v cello #{m[0]}`

Rebuilding LaTeX

guard :shell, :all_on_start => true do
  watch /^([^\/]*)\.tex/ do |m|
    `pdflatex -shell-escape #{m[0]}`
    `rm #{m[1]}.log`

    count = `texcount -inc -nc -1 #{m[0]}`.split('+').first
    msg = "Built #{m[1]}.pdf (#{count} words)"
    n msg, 'LaTeX'
    "-> #{msg}"

Check Syntax of a Ruby File

guard :shell do
  watch /.*\.rb$/ do |m|
    if system("ruby -c #{m[0]}")
      n "#{m[0]} is correct", 'Ruby Syntax', :success
      n "#{m[0]} is incorrect", 'Ruby Syntax', :failed
Something went wrong with that request. Please try again.