Watchexec CLI

A simple standalone tool that watches a path and runs a command whenever it detects modifications.

Example use cases:

Features

Anti-Features

Simple Usage Examples

Watch all JavaScript, CSS and HTML files in the current directory and all subdirectories for changes, running make when a change is detected:

$ watchexec --exts js,css,html make

Call make test when any file changes in this directory/subdirectory, except for everything below target:

$ watchexec -i "target/**" make test

Call ls -la when any file changes in this directory/subdirectory:

$ watchexec -- ls -la

Call/restart python server.py when any Python file in the current directory (and all subdirectories) changes:

$ watchexec -e py -r python server.py

Call/restart my_server when any file in the current directory (and all subdirectories) changes, sending SIGKILL to stop the command:

$ watchexec -r -s SIGKILL my_server

Send a SIGHUP to the command upon changes (Note: using -n here we're executing my_server directly, instead of wrapping it in a shell:

$ watchexec -n -s SIGHUP my_server

Run make when any file changes, using the .gitignore file in the current directory to filter:

$ watchexec make

Run make when any file in lib or src changes:

$ watchexec -w lib -w src make

Run bundle install when the Gemfile changes:

$ watchexec -w Gemfile bundle install

Run two commands:

$ watchexec 'date; make'

If you come from entr, note that the watchexec command is run in a shell by default. You can use -n or --shell=none to not do that:

$ watchexec -n -- echo ';' lorem ipsum

On Windows, you may prefer to use Powershell:

$ watchexec --shell=powershell -- test-connection localhost

Complex Usage Examples

Turn a plain converter tool like PlantUML or Pandoc into a powerful live-editing tool, either as a script

#!/usr/bin/env bash
set -Eeuo pipefail

SOURCE="test.puml"            # Define source file
TARGET="test.png"             # Define conversion target file
CONVERT="plantuml $SOURCE"    # Define how to convert source to target
VIEW="feh $TARGET"            # Define how to open target file
if [ ! -f $TARGET ]; then $CONVERT; fi # Ensure target file exists for opening
$VIEW &                                # Open target file in viewer in the background
watchexec --filter $SOURCE -- $CONVERT    # Update target file on any source file change

or condensed as a single line

# Bash
$ SOURCE="test.puml"; TARGET="test.png"; CONVERT="plantuml $SOURCE"; VIEW="feh $TARGET"; if [ ! -f $TARGET ]; then $CONVERT; fi; ($VIEW &); watchexec -f $SOURCE -- $CONVERT
# Zsh
$ SOURCE="test.puml"; TARGET="test.png"; CONVERT="plantuml $SOURCE"; VIEW="feh $TARGET"; if [ ! -f $TARGET ]; then $CONVERT; fi; ($=VIEW &); watchexec -f $SOURCE -- $CONVERT

Replace PlantUML with another converter like Pandoc: plantuml $SOURCE turns into pandoc $SOURCE --output $TARGET, Similarly, replace the Feh image viewer with another viewer for your target file like the PDF viewer Evince: feh $TARGET turns into evince $TARGET.

Installation

Package manager

Watchexec is in many package managers. A full list of known packages is available, and there may be more out there! Please contribute any you find to the list :)

Common package managers:

Binstall

$ cargo binstall watchexec-cli

Pre-built binaries

Use the download section on Github or the website to obtain the package appropriate for your platform and architecture, extract it, and place it in your PATH.

There are also Debian/Ubuntu (DEB) and Fedora/RedHat (RPM) packages.

Checksums and signatures are available.

Cargo (from source)

Only the latest Rust stable is supported, but older versions may work.

$ cargo install watchexec-cli

Shell completions

Currently available shell completions: