Functions
just
provides many built-in functions for use in expressions, including
recipe body {{…}}
substitutions, assignments, and default parameter values.
All functions ending in _directory
can be abbreviated to _dir
. So
home_directory()
can also be written as home_dir()
. In addition,
invocation_directory_native()
can be abbreviated to
invocation_dir_native()
.
System Information
arch()
— Instruction set architecture. Possible values are:"aarch64"
,"arm"
,"asmjs"
,"hexagon"
,"mips"
,"msp430"
,"powerpc"
,"powerpc64"
,"s390x"
,"sparc"
,"wasm32"
,"x86"
,"x86_64"
, and"xcore"
.num_cpus()
1.15.0 - Number of logical CPUs.os()
— Operating system. Possible values are:"android"
,"bitrig"
,"dragonfly"
,"emscripten"
,"freebsd"
,"haiku"
,"ios"
,"linux"
,"macos"
,"netbsd"
,"openbsd"
,"solaris"
, and"windows"
.os_family()
— Operating system family; possible values are:"unix"
and"windows"
.
For example:
system-info:
@echo "This is an {{arch()}} machine".
$ just system-info
This is an x86_64 machine
The os_family()
function can be used to create cross-platform justfile
s
that work on various operating systems. For an example, see
cross-platform.just
file.
External Commands
-
shell(command, args...)
1.27.0 returns the standard output of shell scriptcommand
with zero or more positional argumentsargs
. The shell used to interpretcommand
is the same shell that is used to evaluate recipe lines, and can be changed withset shell := […]
.command
is passed as the first argument, so if the command is'echo $@'
, the full command line, with the default shell commandsh -cu
andargs
'foo'
and'bar'
will be:'sh' '-cu' 'echo $@' 'echo $@' 'foo' 'bar'
This is so that
$@
works as expected, and$1
refers to the first argument.$@
does not include the first positional argument, which is expected to be the name of the program being run.
# arguments can be variables or expressions
file := '/sys/class/power_supply/BAT0/status'
bat0stat := shell('cat $1', file)
# commands can be variables or expressions
command := 'wc -l'
output := shell(command + ' "$1"', 'main.c')
# arguments referenced by the shell command must be used
empty := shell('echo', 'foo')
full := shell('echo $1', 'foo')
error := shell('echo $1')
# Using python as the shell. Since `python -c` sets `sys.argv[0]` to `'-c'`,
# the first "real" positional argument will be `sys.argv[2]`.
set shell := ["python3", "-c"]
olleh := shell('import sys; print(sys.argv[2][::-1])', 'hello')
Environment Variables
env_var(key)
— Retrieves the environment variable with namekey
, aborting if it is not present.
home_dir := env_var('HOME')
test:
echo "{{home_dir}}"
$ just
/home/user1
env_var_or_default(key, default)
— Retrieves the environment variable with namekey
, returningdefault
if it is not present.env(key)
1.15.0 — Alias forenv_var(key)
.env(key, default)
1.15.0 — Alias forenv_var_or_default(key, default)
.
Invocation Information
is_dependency()
- Returns the stringtrue
if the current recipe is being run as a dependency of another recipe, rather than being run directly, otherwise returns the stringfalse
.
Invocation Directory
invocation_directory()
- Retrieves the absolute path to the current directory whenjust
was invoked, beforejust
changed it (chdir’d) prior to executing commands. On Windows,invocation_directory()
usescygpath
to convert the invocation directory to a Cygwin-compatible/
-separated path. Useinvocation_directory_native()
to return the verbatim invocation directory on all platforms.
For example, to call rustfmt
on files just under the “current directory”
(from the user/invoker’s perspective), use the following rule:
rustfmt:
find {{invocation_directory()}} -name \*.rs -exec rustfmt {} \;
Alternatively, if your command needs to be run from the current directory, you could use (e.g.):
build:
cd {{invocation_directory()}}; ./some_script_that_needs_to_be_run_from_here
invocation_directory_native()
- Retrieves the absolute path to the current directory whenjust
was invoked, beforejust
changed it (chdir’d) prior to executing commands.
Justfile and Justfile Directory
-
justfile()
- Retrieves the path of the currentjustfile
. -
justfile_directory()
- Retrieves the path of the parent directory of the currentjustfile
.
For example, to run a command relative to the location of the current
justfile
:
script:
{{justfile_directory()}}/scripts/some_script
Source and Source Directory
-
source_file()
1.27.0 - Retrieves the path of the current source file. -
source_directory()
1.27.0 - Retrieves the path of the parent directory of the current source file.
source_file()
and source_directory()
behave the same as justfile()
and
justfile_directory()
in the root justfile
, but will return the path and
directory, respectively, of the current import
or mod
source file when
called from within an import or submodule.
Just Executable
just_executable()
- Absolute path to thejust
executable.
For example:
executable:
@echo The executable is at: {{just_executable()}}
$ just
The executable is at: /bin/just
Just Process ID
just_pid()
- Process ID of thejust
executable.
For example:
pid:
@echo The process ID is: {{ just_pid() }}
$ just
The process ID is: 420
String Manipulation
append(suffix, s)
1.27.0 Appendsuffix
to whitespace-separated strings ins
.append('/src', 'foo bar baz')
→'foo/src bar/src baz/src'
prepend(prefix, s)
1.27.0 Prependprefix
to whitespace-separated strings ins
.prepend('src/', 'foo bar baz')
→'src/foo src/bar src/baz'
encode_uri_component(s)
1.27.0 - Percent-encode characters ins
except[A-Za-z0-9_.!~*'()-]
, matching the behavior of the JavaScriptencodeURIComponent
function.quote(s)
- Replace all single quotes with'\''
and prepend and append single quotes tos
. This is sufficient to escape special characters for many shells, including most Bourne shell descendants.replace(s, from, to)
- Replace all occurrences offrom
ins
toto
.replace_regex(s, regex, replacement)
- Replace all occurrences ofregex
ins
toreplacement
. Regular expressions are provided by the Rustregex
crate. See the syntax documentation for usage examples. Capture groups are supported. Thereplacement
string uses Replacement string syntax.trim(s)
- Remove leading and trailing whitespace froms
.trim_end(s)
- Remove trailing whitespace froms
.trim_end_match(s, pat)
- Remove suffix ofs
matchingpat
.trim_end_matches(s, pat)
- Repeatedly remove suffixes ofs
matchingpat
.trim_start(s)
- Remove leading whitespace froms
.trim_start_match(s, pat)
- Remove prefix ofs
matchingpat
.trim_start_matches(s, pat)
- Repeatedly remove prefixes ofs
matchingpat
.
Case Conversion
capitalize(s)
1.7.0 - Convert first character ofs
to uppercase and the rest to lowercase.kebabcase(s)
1.7.0 - Converts
tokebab-case
.lowercamelcase(s)
1.7.0 - Converts
tolowerCamelCase
.lowercase(s)
- Converts
to lowercase.shoutykebabcase(s)
1.7.0 - Converts
toSHOUTY-KEBAB-CASE
.shoutysnakecase(s)
1.7.0 - Converts
toSHOUTY_SNAKE_CASE
.snakecase(s)
1.7.0 - Converts
tosnake_case
.titlecase(s)
1.7.0 - Converts
toTitle Case
.uppercamelcase(s)
1.7.0 - Converts
toUpperCamelCase
.uppercase(s)
- Converts
to uppercase.
Path Manipulation
Fallible
absolute_path(path)
- Absolute path to relativepath
in the working directory.absolute_path("./bar.txt")
in directory/foo
is/foo/bar.txt
.canonicalize(path)
1.24.0 - Canonicalizepath
by resolving symlinks and removing.
,..
, and extra/
s where possible.extension(path)
- Extension ofpath
.extension("/foo/bar.txt")
istxt
.file_name(path)
- File name ofpath
with any leading directory components removed.file_name("/foo/bar.txt")
isbar.txt
.file_stem(path)
- File name ofpath
without extension.file_stem("/foo/bar.txt")
isbar
.parent_directory(path)
- Parent directory ofpath
.parent_directory("/foo/bar.txt")
is/foo
.without_extension(path)
-path
without extension.without_extension("/foo/bar.txt")
is/foo/bar
.
These functions can fail, for example if a path does not have an extension, which will halt execution.
Infallible
clean(path)
- Simplifypath
by removing extra path separators, intermediate.
components, and..
where possible.clean("foo//bar")
isfoo/bar
,clean("foo/..")
is.
,clean("foo/./bar")
isfoo/bar
.join(a, b…)
- This function uses/
on Unix and\
on Windows, which can be lead to unwanted behavior. The/
operator, e.g.,a / b
, which always uses/
, should be considered as a replacement unless\
s are specifically desired on Windows. Join patha
with pathb
.join("foo/bar", "baz")
isfoo/bar/baz
. Accepts two or more arguments.
Filesystem Access
path_exists(path)
- Returnstrue
if the path points at an existing entity andfalse
otherwise. Traverses symbolic links, and returnsfalse
if the path is inaccessible or points to a broken symlink.
Error Reporting
error(message)
- Abort execution and report errormessage
to user.
UUID and Hash Generation
blake3(string)
1.25.0 - Return BLAKE3 hash ofstring
as hexadecimal string.blake3_file(path)
1.25.0 - Return BLAKE3 hash of file atpath
as hexadecimal string.sha256(string)
- Return the SHA-256 hash ofstring
as hexadecimal string.sha256_file(path)
- Return SHA-256 hash of file atpath
as hexadecimal string.uuid()
- Generate a random version 4 UUID.
Random
choose(n, alphabet)
1.27.0 - Generate a string ofn
randomly selected characters fromalphabet
, which may not contain repeated characters. For example,choose('64', HEX)
will generate a random 64-character lowercase hex string.
Datetime
datetime(format)
1.30.0 - Return local time withformat
.datetime_utc(format)
1.30.0 - Return UTC time withformat
.
The arguments to datetime
and datetime_utc
are strftime
-style format
strings, see the
chrono
library docs
for details.
Semantic Versions
semver_matches(version, requirement)
1.16.0 - Check whether a semanticversion
, e.g.,"0.1.0"
matches arequirement
, e.g.,">=0.1.0"
, returning"true"
if so and"false"
otherwise.
Style
-
style(name)
1.37.0 - Return a named terminal display attribute escape sequence used byjust
. Unlike terminal display attribute escape sequence constants, which contain standard colors and styles,style(name)
returns an escape sequence used byjust
itself, and can be used to make recipe output matchjust
’s own output.Recognized values for
name
are'command'
, for echoed recipe lines,error
, andwarning
.For example, to style an error message:
scary: @echo '{{ style("error") }}OH NO{{ NORMAL }}'
XDG Directories1.23.0
These functions return paths to user-specific directories for things like
configuration, data, caches, executables, and the user’s home directory. These
functions follow the
XDG Base Directory Specification,
and are implemented with the
dirs
crate.
cache_directory()
- The user-specific cache directory.config_directory()
- The user-specific configuration directory.config_local_directory()
- The local user-specific configuration directory.data_directory()
- The user-specific data directory.data_local_directory()
- The local user-specific data directory.executable_directory()
- The user-specific executable directory.home_directory()
- The user’s home directory.