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 {{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, 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.