remove non ascii whitespaces

This commit is contained in:
JMARyA 2024-01-17 09:44:04 +01:00
parent 598a10bc28
commit 5a6d6c4d13
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
117 changed files with 1928 additions and 1928 deletions

View file

@ -4,12 +4,12 @@ website: https://just.systems/
repo: https://github.com/casey/just
---
# just
`just` is a handy way to save and run project-specific commands.
Commands, called recipes, are stored in a file called `justfile` with syntax inspired by `make`:
`just` is a handy way to save and run project-specific commands.
Commands, called recipes, are stored in a file called `justfile` with syntax inspired by `make`:
![Screenshot][Screenshot]
You can then run them with `just RECIPE`:
You can then run them with `just RECIPE`:
```shell
$ just test-all
cc *.c -o main
@ -50,7 +50,7 @@ just --variables
| `-d, --working-directory <WORKING-DIRECTORY>` | Use \<WORKING-DIRECTORY> as working directory. `--justfile` must also be set |
## Quick Start
Create a file named `justfile` in the root of your project with the following contents:
Create a file named `justfile` in the root of your project with the following contents:
```
recipe-name:
echo 'This is a recipe!'
@ -60,11 +60,11 @@ another-recipe:
@echo 'This is another recipe.'
```
When you invoke `just` it looks for file `justfile` in the current directory and upwards, so you can invoke it from any subdirectory of your project.
When you invoke `just` it looks for file `justfile` in the current directory and upwards, so you can invoke it from any subdirectory of your project.
The search for a `justfile` is case insensitive, so any case, like `Justfile`, `JUSTFILE`, or `JuStFiLe`, will work. `just` will also look for files with the name `.justfile`, in case youd like to hide a `justfile`.
The search for a `justfile` is case insensitive, so any case, like `Justfile`, `JUSTFILE`, or `JuStFiLe`, will work. `just` will also look for files with the name `.justfile`, in case youd like to hide a `justfile`.
Running `just` with no arguments runs the first recipe in the `justfile`:
Running `just` with no arguments runs the first recipe in the `justfile`:
```shell
$ just
echo 'This is a recipe!'
@ -77,16 +77,16 @@ $ just another-recipe
This is another recipe.
```
`just` prints each command to standard error before running it, which is why `echo 'This is a recipe!'` was printed. This is suppressed for lines starting with `@`, which is why `echo 'This is another recipe.'` was not printed.
`just` prints each command to standard error before running it, which is why `echo 'This is a recipe!'` was printed. This is suppressed for lines starting with `@`, which is why `echo 'This is another recipe.'` was not printed.
Recipes stop running if a command fails. Here `cargo publish` will only run if `cargo test` succeeds:
Recipes stop running if a command fails. Here `cargo publish` will only run if `cargo test` succeeds:
```
publish:
cargo test # tests passed, time to publish!
cargo publish
```
Recipes can depend on other recipes. Here the `test` recipe depends on the `build` recipe, so `build` will run before `test`:
Recipes can depend on other recipes. Here the `test` recipe depends on the `build` recipe, so `build` will run before `test`:
```
build:
@ -115,7 +115,7 @@ cc main.c foo.c bar.c -o main
## Features
### Default Recipe
When `just` is invoked without a recipe, it runs the first recipe in the `justfile`. This recipe might be the most frequently run command in the project, like running the tests:
When `just` is invoked without a recipe, it runs the first recipe in the `justfile`. This recipe might be the most frequently run command in the project, like running the tests:
```
test:
cargo test
@ -135,14 +135,14 @@ lint:
echo Linting
```
If no recipe makes sense as the default recipe, you can add a recipe to the beginning of your `justfile` that lists the available recipes:
If no recipe makes sense as the default recipe, you can add a recipe to the beginning of your `justfile` that lists the available recipes:
```
default:
@just --list
```
### Listing Available Recipes
Recipes can be listed in alphabetical order with `just --list`:
Recipes can be listed in alphabetical order with `just --list`:
```shell
$ just --list
Available recipes:
@ -152,21 +152,21 @@ Available recipes:
lint
```
`just --summary` is more concise:
`just --summary` is more concise:
```shell
$ just --summary
build test deploy lint
```
If you'd like `just` to default to listing the recipes in the `justfile`, you can use this as your default recipe:
If you'd like `just` to default to listing the recipes in the `justfile`, you can use this as your default recipe:
```just
default:
@just --list
```
> Note that you may need to add `--justfile {{justfile()}}` to the line above above. Without it, if you executed `just -f /some/distant/justfile -d .` or `just -f ./non-standard-justfile`, the plain `just --list` inside the recipe would not necessarily use the file you provided. It would try to find a justfile in your current path, maybe even resulting in a `No justfile found` error.
> Note that you may need to add `--justfile {{justfile()}}` to the line above above. Without it, if you executed `just -f /some/distant/justfile -d .` or `just -f ./non-standard-justfile`, the plain `just --list` inside the recipe would not necessarily use the file you provided. It would try to find a justfile in your current path, maybe even resulting in a `No justfile found` error.
The heading text can be customized with `--list-heading`:
The heading text can be customized with `--list-heading`:
```shell
$ just --list --list-heading $'Cool stuff…\n'
Cool stuff…
@ -191,7 +191,7 @@ Building!
```
### Settings
Settings control interpretation and execution. Each setting may be specified at most once, anywhere in the `justfile`.
Settings control interpretation and execution. Each setting may be specified at most once, anywhere in the `justfile`.
For example:
```just
@ -205,36 +205,36 @@ foo:
#### Table of Settings
| Name | Value | Default | Description |
| ------------------------- | ------------------ | ------- | --------------------------------------------------------------------------------------------- |
| `allow-duplicate-recipes` | boolean | `false` | Allow recipes appearing later in a `justfile` to override earlier recipes with the same name. |
| `dotenv-filename` | string | - | Load a `.env` file with a custom name, if present. |
| `dotenv-load` | boolean | `false` | Load a `.env` file, if present. |
| `dotenv-path` | string | - | Load a `.env` file from a custom path, if present. Overrides `dotenv-filename`. |
| `allow-duplicate-recipes` | boolean | `false` | Allow recipes appearing later in a `justfile` to override earlier recipes with the same name. |
| `dotenv-filename` | string | - | Load a `.env` file with a custom name, if present. |
| `dotenv-load` | boolean | `false` | Load a `.env` file, if present. |
| `dotenv-path` | string | - | Load a `.env` file from a custom path, if present. Overrides `dotenv-filename`. |
| `export` | boolean | `false` | Export all variables as [environment variables](../../linux/Environment%20Variables.md). |
| `fallback` | boolean | `false` | Search `justfile` in parent directory if the first recipe on the command line is not found. |
| `ignore-comments` | boolean | `false` | Ignore recipe lines beginning with `#`. |
| `fallback` | boolean | `false` | Search `justfile` in parent directory if the first recipe on the command line is not found. |
| `ignore-comments` | boolean | `false` | Ignore recipe lines beginning with `#`. |
| `positional-arguments` | boolean | `false` | Pass positional arguments. |
| `shell` | `[COMMAND, ARGS…]` | - | Set the command used to invoke recipes and evaluate backticks. |
| `tempdir` | string | - | Create temporary directories in `tempdir` instead of the system default temporary directory. |
| `windows-powershell` | boolean | `false` | Use PowerShell on [Windows](../../windows/Windows.md) as default [shell](Shell.md). (Deprecated. Use `windows-shell` instead. |
| `tempdir` | string | - | Create temporary directories in `tempdir` instead of the system default temporary directory. |
| `windows-powershell` | boolean | `false` | Use PowerShell on [Windows](../../windows/Windows.md) as default [shell](Shell.md). (Deprecated. Use `windows-shell` instead. |
| `windows-shell` | `[COMMAND, ARGS…]` | - | Set the command used to invoke recipes and evaluate backticks. |
#### Dotenv Settings
If `dotenv-load`, `dotenv-filename` or `dotenv-path` is set, `just` will load [environment variables](../../linux/Environment%20Variables.md) from a file.
If `dotenv-load`, `dotenv-filename` or `dotenv-path` is set, `just` will load [environment variables](../../linux/Environment%20Variables.md) from a file.
If `dotenv-path` is set, `just` will look for a file at the given path.
If `dotenv-path` is set, `just` will look for a file at the given path.
Otherwise, `just` looks for a file named `.env` by default, unless `dotenv-filename` set, in which case the value of `dotenv-filename` is used. This file can be located in the same directory as your `justfile` or in a parent directory.
Otherwise, `just` looks for a file named `.env` by default, unless `dotenv-filename` set, in which case the value of `dotenv-filename` is used. This file can be located in the same directory as your `justfile` or in a parent directory.
The loaded variables are [environment variables](../../linux/Environment%20Variables.md), not `just` variables, and so must be accessed using `$VARIABLE_NAME` in recipes and backticks.
The loaded variables are [environment variables](../../linux/Environment%20Variables.md), not `just` variables, and so must be accessed using `$VARIABLE_NAME` in recipes and backticks.
For example, if your `.env` file contains:
For example, if your `.env` file contains:
```shell
# a comment, will be ignored
DATABASE_ADDRESS=localhost:6379
SERVER_PORT=1337
```
And your `justfile` contains:
And your `justfile` contains:
```just
set dotenv-load
@ -243,7 +243,7 @@ serve:
./server --database $DATABASE_ADDRESS --port $SERVER_PORT
```
`just serve` will output:
`just serve` will output:
```shell
$ just serve
Starting server with database localhost:6379 on port 1337…
@ -251,7 +251,7 @@ Starting server with database localhost:6379 on port 1337…
```
#### Positional Arguments
If `positional-arguments` is `true`, recipe arguments will be passed as positional arguments to commands. For linewise recipes, argument `$0` will be the name of the recipe.
If `positional-arguments` is `true`, recipe arguments will be passed as positional arguments to commands. For linewise recipes, argument `$0` will be the name of the recipe.
For example, running this recipe:
```just
@ -269,7 +269,7 @@ foo
hello
```
When using an `sh`-compatible [shell](Shell.md), such as [`bash`](bash.md) or [`zsh`](zsh.md), `$@` expands to the positional arguments given to the recipe, starting from one. When used within double quotes as `"$@"`, arguments including whitespace will be passed on as if they were double-quoted. That is, `"$@"` is equivalent to `"$1" "$2"`… When there are no positional parameters, `"$@"` and `$@` expand to nothing (i.e., they are removed).
When using an `sh`-compatible [shell](Shell.md), such as [`bash`](bash.md) or [`zsh`](zsh.md), `$@` expands to the positional arguments given to the recipe, starting from one. When used within double quotes as `"$@"`, arguments including whitespace will be passed on as if they were double-quoted. That is, `"$@"` is equivalent to `"$1" "$2"`… When there are no positional parameters, `"$@"` and `$@` expand to nothing (i.e., they are removed).
This example recipe will print arguments one by one on separate lines:
```just
@ -279,7 +279,7 @@ set positional-arguments
bash -c 'while (( "$#" )); do echo - $1; shift; done' -- "$@"
```
Running it with _two_ arguments:
Running it with _two_ arguments:
```shell
$ just test foo "bar baz"
- foo
@ -287,7 +287,7 @@ $ just test foo "bar baz"
```
#### Shell
The `shell` setting controls the command used to invoke recipe lines and backticks. Shebang recipes are unaffected.
The `shell` setting controls the command used to invoke recipe lines and backticks. Shebang recipes are unaffected.
```just
# use python3 to execute recipe lines and backticks
set shell := ["python3", "-c"]
@ -300,10 +300,10 @@ foo:
print("{{foos}}")
```
`just` passes the command to be executed as an argument. Many shells will need an additional flag, often `-c`, to make them evaluate the first argument.
`just` passes the command to be executed as an argument. Many shells will need an additional flag, often `-c`, to make them evaluate the first argument.
### Documentation Comments
Comments immediately preceding a recipe will appear in `just --list`:
Comments immediately preceding a recipe will appear in `just --list`:
```just
# build stuff
build:
@ -322,7 +322,7 @@ Available recipes:
```
### Variables and Substitution
Variables, strings, concatenation, path joining, and substitution using `{{…}}` are supported:
Variables, strings, concatenation, path joining, and substitution using `{{…}}` are supported:
```just
tmpdir := `mktemp -d`
version := "0.2.7"
@ -339,7 +339,7 @@ publish:
```
#### Joining Paths
The `/` operator can be used to join two strings with a slash:
The `/` operator can be used to join two strings with a slash:
```just
foo := "a" / "b"
```
@ -349,7 +349,7 @@ $ just --evaluate foo
a/b
```
Note that a `/` is added even if one is already present:
Note that a `/` is added even if one is already present:
```just
foo := "a/"
bar := foo / "b"
@ -370,14 +370,14 @@ $ just --evaluate foo
/b
```
#### Escaping `{{`
To write a recipe containing `{{`, use `{{{{`:
#### Escaping `{{`
To write a recipe containing `{{`, use `{{{{`:
```just
braces:
echo 'I {{{{LOVE}} curly braces!'
```
(An unmatched `}}` is ignored, so it doesn't need to be escaped.)
(An unmatched `}}` is ignored, so it doesn't need to be escaped.)
Another option is to put all the text you'd like to escape inside of an interpolation:
```just
@ -385,14 +385,14 @@ braces:
echo '{{'I {{LOVE}} curly braces!'}}'
```
Yet another option is to use `{{ "{{" }}`:
Yet another option is to use `{{ "{{" }}`:
```just
braces:
echo 'I {{ "{{" }}LOVE}} curly braces!'
```
### Ignoring Errors
Normally, if a command returns a non-zero exit status, execution will stop. To continue execution after a command, even if it fails, prefix the command with `-`:
Normally, if a command returns a non-zero exit status, execution will stop. To continue execution after a command, even if it fails, prefix the command with `-`:
```just
foo:
-cat foo
@ -408,13 +408,13 @@ Done!
```
### Functions
`just` provides a few built-in functions that might be useful when writing recipes.
`just` provides a few built-in functions that might be useful when writing recipes.
#### 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()` - 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"`.
- `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()` - 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:
```just
@ -428,7 +428,7 @@ This is an x86_64 machine
```
#### [Environment Variables](../../linux/Environment%20Variables.md)
- `env_var(key)` — Retrieves the environment variable with name `key`, aborting if it is not present.
- `env_var(key)` — Retrieves the environment variable with name `key`, aborting if it is not present.
```just
home_dir := env_var('HOME')
@ -442,14 +442,14 @@ $ just
/home/user1
```
- `env_var_or_default(key, default)` — Retrieves the environment variable with name `key`, returning `default` if it is not present.
- `env(key)` — Alias for `env_var(key)`.
- `env(key, default)` — Alias for `env_var_or_default(key, default)`.
- `env_var_or_default(key, default)` — Retrieves the environment variable with name `key`, returning `default` if it is not present.
- `env(key)` — Alias for `env_var(key)`.
- `env(key, default)` — Alias for `env_var_or_default(key, default)`.
#### Invocation Directory
- `invocation_directory()` - Retrieves the absolute path to the current directory when `just` was invoked.
- `invocation_directory()` - Retrieves the absolute path to the current directory when `just` was invoked.
For example, to call `rustfmt` on files just under the "current directory" (from the user/invoker's perspective), use the following rule:
For example, to call `rustfmt` on files just under the "current directory" (from the user/invoker's perspective), use the following rule:
```just
rustfmt:
find {{invocation_directory()}} -name \*.rs -exec rustfmt {} \;
@ -462,17 +462,17 @@ build:
```
#### Justfile and Justfile Directory
- `justfile()` - Retrieves the path of the current `justfile`.
- `justfile_directory()` - Retrieves the path of the parent directory of the current `justfile`.
- `justfile()` - Retrieves the path of the current `justfile`.
- `justfile_directory()` - Retrieves the path of the parent directory of the current `justfile`.
For example, to run a command relative to the location of the current `justfile`:
For example, to run a command relative to the location of the current `justfile`:
```just
script:
./{{justfile_directory()}}/scripts/some_script
```
#### Just Executable
- `just_executable()` - Absolute path to the `just` executable.
- `just_executable()` - Absolute path to the `just` executable.
For example:
```just
@ -486,54 +486,54 @@ The executable is at: /bin/just
```
#### String Manipulation
- `quote(s)` - Replace all single quotes with `'\''` and prepend and append single quotes to `s`. This is sufficient to escape special characters for many shells, including most Bourne [shell](Shell.md) descendants.
- `replace(s, from, to)` - Replace all occurrences of `from` in `s` to `to`.
- `replace_regex(s, regex, replacement)` - Replace all occurrences of `regex` in `s` to `replacement`. Regular expressions are provided by the [Rust `regex` crate](https://docs.rs/regex/latest/regex/). See the [syntax documentation](https://docs.rs/regex/latest/regex/#syntax) for usage examples. Capture groups are supported. The `replacement` string uses [Replacement string syntax](https://docs.rs/regex/latest/regex/struct.Regex.html#replacement-string-syntax).
- `trim(s)` - Remove leading and trailing whitespace from `s`.
- `trim_end(s)` - Remove trailing whitespace from `s`.
- `trim_end_match(s, pat)` - Remove suffix of `s` matching `pat`.
- `trim_end_matches(s, pat)` - Repeatedly remove suffixes of `s` matching `pat`.
- `trim_start(s)` - Remove leading whitespace from `s`.
- `trim_start_match(s, pat)` - Remove prefix of `s` matching `pat`.
- `trim_start_matches(s, pat)` - Repeatedly remove prefixes of `s` matching `pat`.
- `quote(s)` - Replace all single quotes with `'\''` and prepend and append single quotes to `s`. This is sufficient to escape special characters for many shells, including most Bourne [shell](Shell.md) descendants.
- `replace(s, from, to)` - Replace all occurrences of `from` in `s` to `to`.
- `replace_regex(s, regex, replacement)` - Replace all occurrences of `regex` in `s` to `replacement`. Regular expressions are provided by the [Rust `regex` crate](https://docs.rs/regex/latest/regex/). See the [syntax documentation](https://docs.rs/regex/latest/regex/#syntax) for usage examples. Capture groups are supported. The `replacement` string uses [Replacement string syntax](https://docs.rs/regex/latest/regex/struct.Regex.html#replacement-string-syntax).
- `trim(s)` - Remove leading and trailing whitespace from `s`.
- `trim_end(s)` - Remove trailing whitespace from `s`.
- `trim_end_match(s, pat)` - Remove suffix of `s` matching `pat`.
- `trim_end_matches(s, pat)` - Repeatedly remove suffixes of `s` matching `pat`.
- `trim_start(s)` - Remove leading whitespace from `s`.
- `trim_start_match(s, pat)` - Remove prefix of `s` matching `pat`.
- `trim_start_matches(s, pat)` - Repeatedly remove prefixes of `s` matching `pat`.
#### Case Conversion
- `capitalize(s)` - Convert first character of `s` to uppercase and the rest to lowercase.
- `kebabcase(s)` - Convert `s` to `kebab-case`.
- `lowercamelcase(s)` - Convert `s` to `lowerCamelCase`.
- `lowercase(s)` - Convert `s` to lowercase.
- `shoutykebabcase(s)` - Convert `s` to `SHOUTY-KEBAB-CASE`.
- `shoutysnakecase(s)` - Convert `s` to `SHOUTY_SNAKE_CASE`.
- `snakecase(s)` - Convert `s` to `snake_case`.
- `titlecase(s)` - Convert `s` to `Title Case`.
- `uppercamelcase(s)` - Convert `s` to `UpperCamelCase`.
- `uppercase(s)` - Convert `s` to uppercase.
- `capitalize(s)` - Convert first character of `s` to uppercase and the rest to lowercase.
- `kebabcase(s)` - Convert `s` to `kebab-case`.
- `lowercamelcase(s)` - Convert `s` to `lowerCamelCase`.
- `lowercase(s)` - Convert `s` to lowercase.
- `shoutykebabcase(s)` - Convert `s` to `SHOUTY-KEBAB-CASE`.
- `shoutysnakecase(s)` - Convert `s` to `SHOUTY_SNAKE_CASE`.
- `snakecase(s)` - Convert `s` to `snake_case`.
- `titlecase(s)` - Convert `s` to `Title Case`.
- `uppercamelcase(s)` - Convert `s` to `UpperCamelCase`.
- `uppercase(s)` - Convert `s` to uppercase.
#### Path Manipulation
##### Fallible
- `absolute_path(path)` - Absolute path to relative `path` in the working directory. `absolute_path("./bar.txt")` in directory `/foo` is `/foo/bar.txt`.
- `extension(path)` - Extension of `path`. `extension("/foo/bar.txt")` is `txt`.
- `file_name(path)` - File name of `path` with any leading directory components removed. `file_name("/foo/bar.txt")` is `bar.txt`.
- `file_stem(path)` - File name of `path` without extension. `file_stem("/foo/bar.txt")` is `bar`.
- `parent_directory(path)` - Parent directory of `path`. `parent_directory("/foo/bar.txt")` is `/foo`.
- `without_extension(path)` - `path` without extension. `without_extension("/foo/bar.txt")` is `/foo/bar`.
- `absolute_path(path)` - Absolute path to relative `path` in the working directory. `absolute_path("./bar.txt")` in directory `/foo` is `/foo/bar.txt`.
- `extension(path)` - Extension of `path`. `extension("/foo/bar.txt")` is `txt`.
- `file_name(path)` - File name of `path` with any leading directory components removed. `file_name("/foo/bar.txt")` is `bar.txt`.
- `file_stem(path)` - File name of `path` without extension. `file_stem("/foo/bar.txt")` is `bar`.
- `parent_directory(path)` - Parent directory of `path`. `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)` - Simplify `path` by removing extra path separators, intermediate `.` components, and `..` where possible. `clean("foo//bar")` is `foo/bar`, `clean("foo/..")` is `.`, `clean("foo/./bar")` is `foo/bar`.
- `join(a, b…)` - _This function uses `/` on Unix and `\` on [Windows](../../windows/Windows.md), 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](../../windows/Windows.md)._ Join path `a` with path `b`. `join("foo/bar", "baz")` is `foo/bar/baz`. Accepts two or more arguments.
- `clean(path)` - Simplify `path` by removing extra path separators, intermediate `.` components, and `..` where possible. `clean("foo//bar")` is `foo/bar`, `clean("foo/..")` is `.`, `clean("foo/./bar")` is `foo/bar`.
- `join(a, b…)` - _This function uses `/` on Unix and `\` on [Windows](../../windows/Windows.md), 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](../../windows/Windows.md)._ Join path `a` with path `b`. `join("foo/bar", "baz")` is `foo/bar/baz`. Accepts two or more arguments.
#### Filesystem Access
- `path_exists(path)` - Returns `true` if the path points at an existing entity and `false` otherwise. Traverses symbolic links, and returns `false` if the path is inaccessible or points to a broken symlink.
- `path_exists(path)` - Returns `true` if the path points at an existing entity and `false` otherwise. Traverses symbolic links, and returns `false` if the path is inaccessible or points to a broken symlink.
#### Error Reporting
- `error(message)` - Abort execution and report error `message` to user.
- `error(message)` - Abort execution and report error `message` to user.
#### UUID and Hash Generation
- `sha256(string)` - Return the [SHA](../../cryptography/SHA.md)-256 hash of `string` as a hexadecimal string.
- `sha256_file(path)` - Return the [SHA](../../cryptography/SHA.md)-256 hash of the file at `path` as a hexadecimal string.
- `uuid()` - Return a randomly generated UUID.
- `sha256(string)` - Return the [SHA](../../cryptography/SHA.md)-256 hash of `string` as a hexadecimal string.
- `sha256_file(path)` - Return the [SHA](../../cryptography/SHA.md)-256 hash of the file at `path` as a hexadecimal string.
- `uuid()` - Return a randomly generated UUID.
### Recipe Attributes
Recipes may be annotated with attributes that change their behavior.
@ -546,7 +546,7 @@ Recipes may be annotated with attributes that change their behavior.
| `[macos]` | Enable recipe on [MacOS](../../macos/macOS.md). |
| `[unix]` | Enable recipe on Unixes. (Includes [MacOS](../../macos/macOS.md)). |
| `[windows]` | Enable recipe on [Windows](../../windows/Windows.md). |
| `[private]`1 | See Private Recipes. |
| `[private]`1 | See Private Recipes. |
A recipe can have multiple attributes, either on multiple lines:
```just
@ -564,9 +564,9 @@ foo:
```
#### Enabling and Disabling Recipes
The `[linux]`, `[macos]`, `[unix]`, and `[windows]` attributes are configuration attributes. By default, recipes are always enabled. A recipe with one or more configuration attributes will only be enabled when one or more of those configurations is active.
The `[linux]`, `[macos]`, `[unix]`, and `[windows]` attributes are configuration attributes. By default, recipes are always enabled. A recipe with one or more configuration attributes will only be enabled when one or more of those configurations is active.
This can be used to write `justfile`s that behave differently depending on which operating system they run on. The `run` recipe in this `justfile` will compile and run `main.c`, using a different C compiler and using the correct output binary name for that compiler depending on the operating system:
This can be used to write `justfile`s that behave differently depending on which operating system they run on. The `run` recipe in this `justfile` will compile and run `main.c`, using a different C compiler and using the correct output binary name for that compiler depending on the operating system:
```just
[unix]
@ -581,9 +581,9 @@ run:
```
#### Disabling Changing Directory
`just` normally executes recipes with the current directory set to the directory that contains the `justfile`. This can be disabled using the `[no-cd]` attribute. This can be used to create recipes which use paths relative to the invocation directory, or which operate on the current directory.
`just` normally executes recipes with the current directory set to the directory that contains the `justfile`. This can be disabled using the `[no-cd]` attribute. This can be used to create recipes which use paths relative to the invocation directory, or which operate on the current directory.
For example, this `commit` recipe:
For example, this `commit` recipe:
```just
[no-cd]
commit file:
@ -591,7 +591,7 @@ commit file:
git commit
```
Can be used with paths that are relative to the current directory, because `[no-cd]` prevents `just` from changing the current directory when executing `commit`.
Can be used with paths that are relative to the current directory, because `[no-cd]` prevents `just` from changing the current directory when executing `commit`.
### Command Evaluation Using Backticks
Backticks can be used to store the result of commands:
@ -612,7 +612,7 @@ stuff := ```
</code></pre>
### Conditional Expressions
`if`/`else` expressions evaluate different branches depending on if two expressions evaluate to the same value:
`if`/`else` expressions evaluate different branches depending on if two expressions evaluate to the same value:
```just
foo := if "2" == "2" { "Good!" } else { "1984" }
@ -651,7 +651,7 @@ $ just bar
match
```
Regular expressions are provided by the [regex crate](https://github.com/rust-lang/regex), whose syntax is documented on [docs.rs](https://docs.rs/regex/1.5.4/regex/#syntax). Since regular expressions commonly use backslash escape sequences, consider using single-quoted string literals, which will pass slashes to the regex parser unmolested.
Regular expressions are provided by the [regex crate](https://github.com/rust-lang/regex), whose syntax is documented on [docs.rs](https://docs.rs/regex/1.5.4/regex/#syntax). Since regular expressions commonly use backslash escape sequences, consider using single-quoted string literals, which will pass slashes to the regex parser unmolested.
Conditional expressions short-circuit, which means they only evaluate one of their branches. This can be used to make sure that backtick expressions don't run when they shouldn't.
```just
@ -664,7 +664,7 @@ bar foo:
echo {{ if foo == "bar" { "hello" } else { "goodbye" } }}
```
> Note the space after the final `}`! Without the space, the interpolation will be prematurely closed.
> Note the space after the final `}`! Without the space, the interpolation will be prematurely closed.
Multiple conditionals can be chained:
```just
@ -686,7 +686,7 @@ abc
```
### Stopping execution with error
Execution can be halted with the `error` function. For example:
Execution can be halted with the `error` function. For example:
```just
foo := if "hello" == "goodbye" {
"xyz"
@ -722,14 +722,14 @@ $ just
./test --test linux
```
Any number of arguments of the form `NAME=VALUE` can be passed before recipes:
Any number of arguments of the form `NAME=VALUE` can be passed before recipes:
```shell
$ just os=plan9
./build plan9
./test --test plan9
```
Or you can use the `--set` flag:
Or you can use the `--set` flag:
```shell
$ just --set os bsd
./build bsd
@ -737,8 +737,8 @@ $ just --set os bsd
```
### Getting and Setting [Environment Variables](../../linux/Environment%20Variables.md)
#### Exporting `just` Variables
Assignments prefixed with the `export` keyword will be exported to recipes as [environment variables](../../linux/Environment%20Variables.md):
#### Exporting `just` Variables
Assignments prefixed with the `export` keyword will be exported to recipes as [environment variables](../../linux/Environment%20Variables.md):
```just
export RUST_BACKTRACE := "1"
@ -747,7 +747,7 @@ test:
cargo test
```
Parameters prefixed with a `$` will be exported as [environment variables](../../linux/Environment%20Variables.md):
Parameters prefixed with a `$` will be exported as [environment variables](../../linux/Environment%20Variables.md):
```just
test $RUST_BACKTRACE="1":
# will print a stack trace if it crashes
@ -767,7 +767,7 @@ a $A $B=`echo $A`:
echo $A $B
```
When `export` is set, all `just` variables are exported as [environment variables](../../linux/Environment%20Variables.md).
When `export` is set, all `just` variables are exported as [environment variables](../../linux/Environment%20Variables.md).
#### Getting [Environment Variables](../../linux/Environment%20Variables.md) from the environment
[Environment variables](../../linux/Environment%20Variables.md) from the environment are passed automatically to the recipes.
@ -782,11 +782,11 @@ $ just
HOME is '/home/myuser'
```
#### Setting `just` Variables from [Environment Variables](../../linux/Environment%20Variables.md)
[Environment variables](../../linux/Environment%20Variables.md) can be propagated to `just` variables using the functions `env_var()` and `env_var_or_default()`.
#### Setting `just` Variables from [Environment Variables](../../linux/Environment%20Variables.md)
[Environment variables](../../linux/Environment%20Variables.md) can be propagated to `just` variables using the functions `env_var()` and `env_var_or_default()`.
### Recipe Parameters
Recipes may have parameters. Here recipe `build` has a parameter called `target`:
Recipes may have parameters. Here recipe `build` has a parameter called `target`:
```just
build target:
@echo 'Building {{target}}…'
@ -860,13 +860,13 @@ test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
./test {{triple}}
```
The last parameter of a recipe may be variadic, indicated with either a `+` or a `*` before the argument name:
The last parameter of a recipe may be variadic, indicated with either a `+` or a `*` before the argument name:
```just
backup +FILES:
scp {{FILES}} me@server.com:
```
Variadic parameters prefixed with `+` accept _one or more_ arguments and expand to a string containing those arguments separated by spaces:
Variadic parameters prefixed with `+` accept _one or more_ arguments and expand to a string containing those arguments separated by spaces:
```shell
$ just backup FAQ.md GRAMMAR.md
scp FAQ.md GRAMMAR.md me@server.com:
@ -874,7 +874,7 @@ FAQ.md 100% 1831 1.8KB/s 00:00
GRAMMAR.md 100% 1666 1.6KB/s 00:00
```
Variadic parameters prefixed with `*` accept _zero or more_ arguments and expand to a string containing those arguments separated by spaces, or an empty string if no arguments are present:
Variadic parameters prefixed with `*` accept _zero or more_ arguments and expand to a string containing those arguments separated by spaces, or an empty string if no arguments are present:
```just
commit MESSAGE *FLAGS:
git commit {{FLAGS}} -m "{{MESSAGE}}"
@ -886,7 +886,7 @@ test +FLAGS='-q':
cargo test {{FLAGS}}
```
`{{…}}` substitutions may need to be quoted if they contain spaces. For example, if you have the following recipe:
`{{…}}` substitutions may need to be quoted if they contain spaces. For example, if you have the following recipe:
```just
search QUERY:
lynx https://www.google.com/?q={{QUERY}}
@ -897,7 +897,7 @@ And you type:
$ just search "cat toupee"
```
`just` will run the command `lynx https://www.google.com/?q=cat toupee`, which will get parsed by `sh` as `lynx`, `https://www.google.com/?q=cat`, and `toupee`, and not the intended `lynx` and `https://www.google.com/?q=cat toupee`.
`just` will run the command `lynx https://www.google.com/?q=cat toupee`, which will get parsed by `sh` as `lynx`, `https://www.google.com/?q=cat`, and `toupee`, and not the intended `lynx` and `https://www.google.com/?q=cat toupee`.
You can fix this by adding quotes:
```just
@ -905,7 +905,7 @@ search QUERY:
lynx 'https://www.google.com/?q={{QUERY}}'
```
Parameters prefixed with a `$` will be exported as [environment variables](../../linux/Environment%20Variables.md):
Parameters prefixed with a `$` will be exported as [environment variables](../../linux/Environment%20Variables.md):
```just
foo $bar:
echo $bar
@ -914,7 +914,7 @@ foo $bar:
### Running Recipes at the End of a Recipe
Normal dependencies of a recipes always run before a recipe starts. That is to say, the dependee always runs before the depender. These dependencies are called "prior dependencies".
A recipe can also have subsequent dependencies, which run after the recipe and are introduced with an `&&`:
A recipe can also have subsequent dependencies, which run after the recipe and are introduced with an `&&`:
```just
a:
echo 'A!'
@ -929,7 +929,7 @@ d:
echo 'D!'
```
…running _b_ prints:
…running _b_ prints:
```shell
$ just b
echo 'A!'
@ -943,7 +943,7 @@ D!
```
### Running Recipes in the Middle of a Recipe
`just` doesn't support running recipes in the middle of another recipe, but you can call `just` recursively in the middle of a recipe. Given the following `justfile`:
`just` doesn't support running recipes in the middle of another recipe, but you can call `just` recursively in the middle of a recipe. Given the following `justfile`:
```just
a:
echo 'A!'
@ -957,7 +957,7 @@ c:
echo 'C!'
```
…running _b_ prints:
…running _b_ prints:
```shell
$ just b
echo 'A!'
@ -970,10 +970,10 @@ echo 'B end!'
B end!
```
This has limitations, since recipe `c` is run with an entirely new invocation of `just`: Assignments will be recalculated, dependencies might run twice, and command line arguments will not be propagated to the child `just` process.
This has limitations, since recipe `c` is run with an entirely new invocation of `just`: Assignments will be recalculated, dependencies might run twice, and command line arguments will not be propagated to the child `just` process.
### Writing Recipes in Other Languages
Recipes that start with `#!` are called shebang recipes, and are executed by saving the recipe body to a file and running it. This lets you write recipes in different languages:
Recipes that start with `#!` are called shebang recipes, and are executed by saving the recipe body to a file and running it. This lets you write recipes in different languages:
```just
polyglot: python js perl sh ruby nu
@ -1014,14 +1014,14 @@ Hola from a nushell script!
Hello from ruby!
```
On Unix-like operating systems, including [Linux](../../linux/Linux.md) and [MacOS](../../macos/macOS.md), shebang recipes are executed by saving the recipe body to a file in a temporary directory, marking the file as executable, and executing it. The OS then parses the shebang line into a command line and invokes it, including the path to the file. For example, if a recipe starts with `#!/usr/bin/env bash`, the final command that the OS runs will be something like `/usr/bin/env bash /tmp/PATH_TO_SAVED_RECIPE_BODY`. Keep in mind that different operating systems split shebang lines differently.
On Unix-like operating systems, including [Linux](../../linux/Linux.md) and [MacOS](../../macos/macOS.md), shebang recipes are executed by saving the recipe body to a file in a temporary directory, marking the file as executable, and executing it. The OS then parses the shebang line into a command line and invokes it, including the path to the file. For example, if a recipe starts with `#!/usr/bin/env bash`, the final command that the OS runs will be something like `/usr/bin/env bash /tmp/PATH_TO_SAVED_RECIPE_BODY`. Keep in mind that different operating systems split shebang lines differently.
[Windows](../../windows/Windows.md) does not support shebang lines. On [Windows](../../windows/Windows.md), `just` splits the shebang line into a command and arguments, saves the recipe body to a file, and invokes the split command and arguments, adding the path to the saved recipe body as the final argument.
[Windows](../../windows/Windows.md) does not support shebang lines. On [Windows](../../windows/Windows.md), `just` splits the shebang line into a command and arguments, saves the recipe body to a file, and invokes the split command and arguments, adding the path to the saved recipe body as the final argument.
### Multi-Line Constructs
Recipes without an initial shebang are evaluated and run line-by-line, which means that multi-line constructs probably won't do what you want.
For example, with the following `justfile`:
For example, with the following `justfile`:
```makefile
conditional:
if true; then
@ -1029,7 +1029,7 @@ conditional:
fi
```
The extra leading whitespace before the second line of the `conditional` recipe will produce a parse error:
The extra leading whitespace before the second line of the `conditional` recipe will produce a parse error:
```shell
$ just conditional
error: Recipe line has extra leading whitespace
@ -1040,7 +1040,7 @@ error: Recipe line has extra leading whitespace
To work around this, you can write conditionals on one line, escape newlines with slashes, or add a shebang to your recipe. Some examples of multi-line constructs are provided for reference.
#### `if` statements
#### `if` statements
```just
conditional:
if true; then echo 'True!'; fi
@ -1061,7 +1061,7 @@ conditional:
fi
```
#### `for` loops
#### `for` loops
```just
for:
for file in `ls .`; do echo $file; done
@ -1082,7 +1082,7 @@ for:
done
```
#### `while` loops
#### `while` loops
```just
while:
while `server-is-dead`; do ping -c 1 server; done
@ -1104,7 +1104,7 @@ while:
```
### Private Recipes
Recipes and aliases whose name starts with a `_` are omitted from `just --list`:
Recipes and aliases whose name starts with a `_` are omitted from `just --list`:
```just
test: _test-helper
./bin/test
@ -1119,7 +1119,7 @@ Available recipes:
test
```
The `[private]` attribute may also be used to hide recipes or aliases without needing to change the name:
The `[private]` attribute may also be used to hide recipes or aliases without needing to change the name:
```just
[private]
foo: