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 users 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 {{arument}}
, 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
, 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 $argumant
, but works for all possible values of argument
, including those with double quotes.