Avoiding Argument Splitting
Given this justfile:
foo argument:
touch {{argument}}
The following command will create two files, some and argument.txt:
$ just foo "some argument.txt"
The user’s shell will parse "some argument.txt" as a single argument, but
when just replaces touch {{argument}} with touch some argument.txt, the
quotes are not preserved, and touch will receive two arguments.
There are a few ways to avoid this: quoting, positional arguments, and exported arguments.
Quoting
Quotes can be added around the {{argument}} interpolation:
foo argument:
touch '{{argument}}'
This preserves just’s ability to catch variable name typos before running,
for example if you were to write {{argument}}, but will not do what you want
if the value of argument contains single quotes.
Positional Arguments
The positional-arguments setting causes all arguments to be passed as
positional arguments, allowing them to be accessed with $1, $2, …, and
$@, which can be then double-quoted to avoid further splitting by the shell:
set positional-arguments
foo argument:
touch "$1"
This defeats just’s ability to catch typos, for example if you type $2
instead of $1, but works for all possible values of argument, including
those with double quotes.
Exported Arguments
All arguments are exported when the export setting is set:
set export
foo argument:
touch "$argument"
Or individual arguments may be exported by prefixing them with $:
foo $argument:
touch "$argument"
This defeats just’s ability to catch typos, for example if you type
$argument, but works for all possible values of argument, including those
with double quotes.