[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1870":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},1870,"just","casey\u002Fjust","casey","🤖 Just a command runner","https:\u002F\u002Fjust.systems",null,"Rust",34302,795,101,281,0,30,177,781,145,43.7,"Creative Commons Zero v1.0 Universal",false,"master",true,[],"2026-06-12 02:00:34","\u003Cdiv align=right>Table of Contents↗️\u003C\u002Fdiv>\n\n\u003Ch1 align=center>\u003Ccode>just\u003C\u002Fcode>\u003C\u002Fh1>\n\n\u003Cdiv align=center>\n  \u003Ca href=https:\u002F\u002Fcrates.io\u002Fcrates\u002Fjust>\n    \u003Cimg src=https:\u002F\u002Fimg.shields.io\u002Fcrates\u002Fv\u002Fjust.svg alt=\"crates.io version\">\n  \u003C\u002Fa>\n  \u003Ca href=https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Factions\u002Fworkflows\u002Fci.yaml>\n    \u003Cimg src=https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Factions\u002Fworkflows\u002Fci.yaml\u002Fbadge.svg alt=\"build status\">\n  \u003C\u002Fa>\n  \u003Ca href=https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Freleases>\n    \u003Cimg src=https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fcasey\u002Fjust\u002Ftotal.svg alt=downloads>\n  \u003C\u002Fa>\n  \u003Ca href=https:\u002F\u002Fdiscord.gg\u002FezYScXR>\n    \u003Cimg src=https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F695580069837406228?logo=discord alt=\"chat on discord\">\n  \u003C\u002Fa>\n  \u003Ca href=mailto:casey@rodarmor.com?subject=Thanks%20for%20Just!>\n    \u003Cimg src=https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSay%20Thanks-!-1EAEDB.svg alt=\"say thanks\">\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\u003Cbr>\n\n`just` is a handy way to save and run project-specific commands.\n\nThis readme is also available as a [book](https:\u002F\u002Fjust.systems\u002Fman\u002Fen\u002F). The\nbook reflects the latest release, whereas the\n[readme on GitHub](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Fblob\u002Fmaster\u002FREADME.md)\nreflects latest master.\n\n(中文文档在 [这里](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Fblob\u002Fmaster\u002FREADME.中文.md),\n快看过来!)\n\nCommands, called recipes, are stored in a file called `justfile` with syntax\ninspired by `make`:\n\n![screenshot](https:\u002F\u002Fraw.githubusercontent.com\u002Fcasey\u002Fjust\u002Fmaster\u002Fetc\u002Fscreenshot.png)\n\nYou can then run them with `just RECIPE`:\n\n```console\n$ just test-all\ncc *.c -o main\n.\u002Ftest --all\nYay, all your tests passed!\n```\n\n`just` has a ton of useful features, and many improvements over `make`:\n\n- `just` is a command runner, not a build system, so it avoids much of\n  [`make`'s complexity and idiosyncrasies](#what-are-the-idiosyncrasies-of-make-that-just-avoids).\n  No need for `.PHONY` recipes!\n\n- Linux, macOS, Windows, and other reasonable unixes are supported with no\n  additional dependencies. (Although if your system doesn't have an `sh`,\n  you'll need to [choose a different shell](#shell).)\n\n- Errors are specific and informative, and syntax errors are reported along\n  with their source context.\n\n- Recipes can accept [command line arguments](#recipe-parameters).\n\n- Wherever possible, errors are resolved statically. Unknown recipes and\n  circular dependencies are reported before anything runs.\n\n- `just` [loads `.env` files](#dotenv-settings), making it easy to populate\n  environment variables.\n\n- Recipes can be [listed from the command line](#listing-available-recipes).\n\n- Command line completion scripts are\n  [available for most popular shells](#shell-completion-scripts).\n\n- Recipes can be written in\n  [arbitrary languages](#shebang-recipes), like Python or Node.js.\n\n- `just` can be invoked from any subdirectory, not just the directory that\n  contains the `justfile`.\n\n- And [much more](https:\u002F\u002Fjust.systems\u002Fman\u002Fen\u002F)!\n\nIf you need help with `just`, please feel free to open an issue or ping me on\n[Discord](https:\u002F\u002Fdiscord.gg\u002FezYScXR). Feature requests and bug reports are\nalways welcome!\n\nInstallation\n------------\n\nJust can be installed using your favorite [package manager](#packages), by\ndownloading [pre-built binaries](#pre-built-binaries), or building from source\nwith `cargo install just`.\n\n### Prerequisites\n\n`just` should run on any system with a reasonable `sh`, including Linux, macOS,\nand the BSDs.\n\n#### Windows\n\nOn Windows, `just` works with the `sh` provided by\n[Git for Windows](https:\u002F\u002Fgit-scm.com),\n[GitHub Desktop](https:\u002F\u002Fdesktop.github.com), or\n[Cygwin](http:\u002F\u002Fwww.cygwin.com). After installation, `sh` must be available in\nthe `PATH` of the shell you want to invoke `just` from.\n\nIf you'd rather not install `sh`, you can use the `shell` setting to use the\nshell of your choice.\n\nLike PowerShell:\n\n```just\n# use PowerShell instead of sh:\nset shell := [\"powershell.exe\", \"-c\"]\n\nhello:\n  Write-Host \"Hello, world!\"\n```\n\n…or `cmd.exe`:\n\n```just\n# use cmd.exe instead of sh:\nset shell := [\"cmd.exe\", \"\u002Fc\"]\n\nlist:\n  dir\n```\n\nYou can also set the shell using command-line arguments. For example, to use\nPowerShell, launch `just` with `--shell powershell.exe --shell-arg -c`.\n\n(PowerShell is installed by default on Windows 7 SP1 and Windows Server 2008 R2\nSP1 and later, and `cmd.exe` is quite fiddly, so PowerShell is recommended for\nmost Windows users.)\n\n### Packages\n\n#### Cross-platform\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Package Manager\u003C\u002Fth>\n      \u003Cth>Package\u003C\u002Fth>\n      \u003Cth>Command\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Falexellis\u002Farkade>arkade\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>just\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>arkade get just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fasdf-vm.com>asdf\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Folofvndrhr\u002Fasdf-just>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\n        \u003Ccode>asdf plugin add just\u003C\u002Fcode>\u003Cbr>\n        \u003Ccode>asdf install just &lt;version&gt;\u003C\u002Fcode>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.rust-lang.org>Cargo\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fcrates.io\u002Fcrates\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>cargo install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Fcargo-bins\u002Fcargo-binstall>Cargo Binstall\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fcrates.io\u002Fcrates\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>cargo binstall just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fdocs.conda.io\u002Fprojects\u002Fconda\u002Fen\u002Flatest\u002Findex.html>Conda\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fanaconda.org\u002Fconda-forge\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>conda install -c conda-forge just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fbrew.sh>Homebrew\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fformulae.brew.sh\u002Fformula\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>brew install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fnixos.org\u002Fnix\u002F>Nix\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002FNixOS\u002Fnixpkgs\u002Fblob\u002Fmaster\u002Fpkgs\u002Fby-name\u002Fju\u002Fjust\u002Fpackage.nix>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>nix-env -iA nixpkgs.just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.npmjs.com\u002F>npm\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Frust-just>rust-just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>npm install -g rust-just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpipx.pypa.io\u002Fstable\u002F>pipx\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpypi.org\u002Fproject\u002Frust-just\u002F>rust-just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>pipx install rust-just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fsnapcraft.io>Snap\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fsnapcraft.io\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>snap install --edge --classic just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F>uv\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpypi.org\u002Fproject\u002Frust-just\u002F>rust-just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>uv tool install rust-just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n#### BSD\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Operating System\u003C\u002Fth>\n      \u003Cth>Package Manager\u003C\u002Fth>\n      \u003Cth>Package\u003C\u002Fth>\n      \u003Cth>Command\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.freebsd.org>FreeBSD\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.freebsd.org\u002Fdoc\u002Fhandbook\u002Fpkgng-intro.html>pkg\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.freshports.org\u002Fdeskutils\u002Fjust\u002F>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>pkg install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.openbsd.org>OpenBSD\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.openbsd.org\u002Ffaq\u002Ffaq15.html>pkg_*\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fcvsweb.openbsd.org\u002Fcgi-bin\u002Fcvsweb\u002Fports\u002Fsysutils\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>pkg_add just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n#### Linux\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Operating System\u003C\u002Fth>\n      \u003Cth>Package Manager\u003C\u002Fth>\n      \u003Cth>Package\u003C\u002Fth>\n      \u003Cth>Command\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Falpinelinux.org>Alpine\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwiki.alpinelinux.org\u002Fwiki\u002FAlpine_Linux_package_management>apk-tools\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpkgs.alpinelinux.org\u002Fpackage\u002Fedge\u002Fcommunity\u002Fx86_64\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>apk add just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.archlinux.org>Arch\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwiki.archlinux.org\u002Ftitle\u002FPacman>pacman\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Farchlinux.org\u002Fpackages\u002Fextra\u002Fx86_64\u002Fjust\u002F>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>pacman -S just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\n        \u003Ca href=https:\u002F\u002Fdebian.org>Debian 13\u003C\u002Fa> and\n        \u003Ca href=https:\u002F\u002Fubuntu.com>Ubuntu 24.04\u003C\u002Fa> derivatives\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAPT_(software)>apt\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpackages.debian.org\u002Ftrixie\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>apt install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgetfedora.org>Fedora\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fdnf.readthedocs.io\u002Fen\u002Flatest\u002F>DNF\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fsrc.fedoraproject.org\u002Frpms\u002Frust-just>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>dnf install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.gentoo.org>Gentoo\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwiki.gentoo.org\u002Fwiki\u002FPortage>Portage\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fpackages.gentoo.org\u002Fpackages\u002Fdev-build\u002Fjust>dev-build\u002Fjust\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\n        \u003Ccode>emerge -av dev-build\u002Fjust\u003C\u002Fcode>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fnixos.org\u002Fnixos\u002F>NixOS\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fnixos.org\u002Fnix\u002F>Nix\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002FNixOS\u002Fnixpkgs\u002Fblob\u002Fmaster\u002Fpkgs\u002Fby-name\u002Fju\u002Fjust\u002Fpackage.nix>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>nix-env -iA nixos.just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fopensuse.org>openSUSE\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fen.opensuse.org\u002FPortal:Zypper>Zypper\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fbuild.opensuse.org\u002Fpackage\u002Fshow\u002FBase:System\u002Fjust>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>zypper in just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgetsol.us>Solus\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgetsol.us\u002Farticles\u002Fpackage-management\u002Fbasics\u002Fen>eopkg\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fdev.getsol.us\u002Fsource\u002Fjust\u002F>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>eopkg install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fvoidlinux.org>Void\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwiki.voidlinux.org\u002FXBPS>XBPS\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Fvoid-linux\u002Fvoid-packages\u002Fblob\u002Fmaster\u002Fsrcpkgs\u002Fjust\u002Ftemplate>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>xbps-install -S just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n#### Windows\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Package Manager\u003C\u002Fth>\n      \u003Cth>Package\u003C\u002Fth>\n      \u003Cth>Command\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fchocolatey.org>Chocolatey\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Fmichidk\u002Fjust-choco>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>choco install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fscoop.sh>Scoop\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002FScoopInstaller\u002FMain\u002Fblob\u002Fmaster\u002Fbucket\u002Fjust.json>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>scoop install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fpackage-manager\u002F>Windows Package Manager\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fwinget-pkgs\u002Ftree\u002Fmaster\u002Fmanifests\u002Fc\u002FCasey\u002FJust>Casey\u002FJust\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>winget install --id Casey.Just --exact\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n#### macOS\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Package Manager\u003C\u002Fth>\n      \u003Cth>Package\u003C\u002Fth>\n      \u003Cth>Command\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fwww.macports.org>MacPorts\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ca href=https:\u002F\u002Fports.macports.org\u002Fport\u002Fjust\u002Fsummary>just\u003C\u002Fa>\u003C\u002Ftd>\n      \u003Ctd>\u003Ccode>port install just\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n![just package version table](https:\u002F\u002Frepology.org\u002Fbadge\u002Fvertical-allrepos\u002Fjust.svg)\n\n### Pre-Built Binaries\n\nPre-built binaries for Linux, macOS, and Windows can be found on\n[the releases page](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Freleases).\n\nYou can use the following command on Linux, macOS, or Windows to download the\nlatest release, just replace `DEST` with the directory where you'd like to put\n`just`:\n\n```console\ncurl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fjust.systems\u002Finstall.sh | bash -s -- --to DEST\n```\n\nFor example, to install `just` to `~\u002Fbin`:\n\n```console\n# create ~\u002Fbin\nmkdir -p ~\u002Fbin\n\n# download and extract just to ~\u002Fbin\u002Fjust\ncurl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fjust.systems\u002Finstall.sh | bash -s -- --to ~\u002Fbin\n\n# add `~\u002Fbin` to the paths that your shell searches for executables\n# this line should be added to your shell's initialization file,\n# e.g. `~\u002F.bashrc` or `~\u002F.zshrc`\nexport PATH=\"$PATH:$HOME\u002Fbin\"\n\n# just should now be executable\njust --help\n```\n\nNote that `install.sh` may fail on GitHub Actions, or in other environments\nwhere many machines share IP addresses. `install.sh` calls GitHub APIs in order\nto determine the latest version of `just` to install, and those API calls are\nrate-limited on a per-IP basis. To make `install.sh` more reliable in such\ncircumstances, pass a specific tag to install with `--tag`.\n\nAnother way to avoid rate-limiting is to pass a GitHub authentication token to\n`install.sh` as an environment variable named `GITHUB_TOKEN`, allowing it to\nauthenticate its requests.\n\n[Releases](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Freleases) include a `SHA256SUM` file\nwhich can be used to verify the integrity of pre-built binary archives.\n\nTo verify a release, download the pre-built binary archive along with the\n`SHA256SUM` file and run:\n\n```sh\nshasum --algorithm 256 --ignore-missing --check SHA256SUMS\n```\n\n### GitHub Actions\n\n`just` can be installed on GitHub Actions in a few ways.\n\nUsing package managers pre-installed on GitHub Actions runners on macOS with\n`brew install just`, and on Windows with `choco install just`.\n\nWith [extractions\u002Fsetup-just](https:\u002F\u002Fgithub.com\u002Fextractions\u002Fsetup-just):\n\n```yaml\n- uses: extractions\u002Fsetup-just@v3\n  with:\n    just-version: 1.5.0  # optional semver specification, otherwise latest\n```\n\nOr with [taiki-e\u002Finstall-action](https:\u002F\u002Fgithub.com\u002Ftaiki-e\u002Finstall-action):\n\n```yaml\n- uses: taiki-e\u002Finstall-action@just\n```\n\n### Docker\n\n`just` is available as a Docker image from\n[the GitHub Container Registry](https:\u002F\u002Fghcr.io\u002Fcasey\u002Fjust).\n\nTo copy `just` into a Docker image, add the following line to your\n`Dockerfile`:\n\n```dockerfile\nCOPY --from=ghcr.io\u002Fcasey\u002Fjust:latest \u002Fjust \u002Fusr\u002Flocal\u002Fbin\u002F\n```\n\nAfter copying, `just` may also be used as part of a docker build:\n\n```dockerfile\nRUN just\n```\n\n### Release RSS Feed\n\nAn [RSS feed](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRSS) of `just` releases is\navailable [here](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Freleases.atom).\n\n### Node.js Installation\n\n[just-install](https:\u002F\u002Fnpmjs.com\u002Fpackage\u002Fjust-install) can be used to automate\ninstallation of `just` in Node.js applications.\n\n`just` is a great, more robust alternative to npm scripts. If you want to\ninclude `just` in the dependencies of a Node.js application, `just-install`\nwill install a local, platform-specific binary as part of the `npm install`\ncommand. This removes the need for every developer to install `just`\nindependently using one of the processes mentioned above. After installation,\nthe `just` command will work in npm scripts or with npx. It's great for teams\nwho want to make the setup process for their project as easy as possible.\n\nFor more information, see the\n[just-install README file](https:\u002F\u002Fgithub.com\u002Fbrombal\u002Fjust-install#readme).\n\n### Nix Flake\n\nThe `just` repository includes a\n[`flake.nix`](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Ftree\u002Fmaster\u002Fflake.nix) that defines\na [nix flake](https:\u002F\u002Fnix.dev\u002Fconcepts\u002Fflakes.html), allowing you to use `just`\nas an input to another flake:\n\n```nix\n{\n  inputs = {\n    just.url = \"github:casey\u002Fjust\";\n  }\n\n  outputs = {self, nixpkgs, just}: {\n  }\n}\n```\n\nBackwards Compatibility\n-----------------------\n\nWith the release of version 1.0, `just` features a strong commitment to\nbackwards compatibility and stability.\n\nFuture releases will not introduce backwards incompatible changes that make\nexisting `justfile`s stop working, or break working invocations of the\ncommand-line interface.\n\nThis does not, however, preclude fixing outright bugs, even if doing so might\nbreak `justfiles` that rely on their behavior.\n\nThere will never be a `just` 2.0. Any desirable backwards-incompatible changes\nwill be opt-in on a per-`justfile` basis, so users may migrate at their\nleisure.\n\nFeatures that aren't yet ready for stabilization are marked as unstable and may\nbe changed or removed at any time. Using unstable features produces an error by\ndefault, which can be suppressed by passing the `--unstable` flag,\n`set unstable`, or setting the environment variable `JUST_UNSTABLE` to any\nvalue other than `false`, `0`, or the empty string.\n\nEditor Support\n--------------\n\n`justfile` syntax is close enough to `make` that you may want to tell your\neditor to use `make` syntax highlighting for `just`.\n\n### Vim and Neovim\n\nVim version 9.1.1042 or better and Neovim version 0.11 or better support\nJustfile syntax highlighting out of the box, thanks to\n[pbnj](https:\u002F\u002Fgithub.com\u002Fpbnj).\n\n#### `vim-just`\n\nThe [vim-just](https:\u002F\u002Fgithub.com\u002FNoahTheDuke\u002Fvim-just) plugin provides syntax\nhighlighting for `justfile`s.\n\nInstall it with your favorite package manager, like\n[Plug](https:\u002F\u002Fgithub.com\u002Fjunegunn\u002Fvim-plug):\n\n```vim\ncall plug#begin()\n\nPlug 'NoahTheDuke\u002Fvim-just'\n\ncall plug#end()\n```\n\nOr with Vim's built-in package support:\n\n```console\nmkdir -p ~\u002F.vim\u002Fpack\u002Fvendor\u002Fstart\ncd ~\u002F.vim\u002Fpack\u002Fvendor\u002Fstart\ngit clone https:\u002F\u002Fgithub.com\u002FNoahTheDuke\u002Fvim-just.git\n```\n\n#### `tree-sitter-just`\n\n[tree-sitter-just](https:\u002F\u002Fgithub.com\u002FIndianBoy42\u002Ftree-sitter-just) is an\n[Nvim Treesitter](https:\u002F\u002Fgithub.com\u002Fnvim-treesitter\u002Fnvim-treesitter) plugin\nfor Neovim.\n\n### Emacs\n\n[just-mode](https:\u002F\u002Fgithub.com\u002Fleon-barrett\u002Fjust-mode.el) provides syntax\nhighlighting and automatic indentation of `justfile`s. It is available on\n[MELPA](https:\u002F\u002Fmelpa.org\u002F) as [just-mode](https:\u002F\u002Fmelpa.org\u002F#\u002Fjust-mode).\n\n[justl](https:\u002F\u002Fgithub.com\u002Fpsibi\u002Fjustl.el) provides commands for executing and\nlisting recipes.\n\nYou can add the following to an individual `justfile` to enable `make` mode on\na per-file basis:\n\n```text\n# Local Variables:\n# mode: makefile\n# End:\n```\n\n### Visual Studio Code\n\nAn extension for VS Code is [available here](https:\u002F\u002Fgithub.com\u002Fnefrob\u002Fvscode-just).\n\nUnmaintained VS Code extensions include\n[skellock\u002Fvscode-just](https:\u002F\u002Fgithub.com\u002Fskellock\u002Fvscode-just) and\n[sclu1034\u002Fvscode-just](https:\u002F\u002Fgithub.com\u002Fsclu1034\u002Fvscode-just).\n\n### JetBrains IDEs\n\nA plugin for JetBrains IDEs by [linux_china](https:\u002F\u002Fgithub.com\u002Flinux-china) is\n[available here](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F18658-just).\n\n### Kakoune\n\nKakoune supports `justfile` syntax highlighting out of the box, thanks to\nTeddyDD.\n\n### Helix\n\n[Helix](https:\u002F\u002Fhelix-editor.com\u002F) supports `justfile` syntax highlighting\nout-of-the-box since version 23.05.\n\n### Sublime Text\n\nThe [Just package](https:\u002F\u002Fgithub.com\u002Fnk9\u002Fjust_sublime) by\n[nk9](https:\u002F\u002Fgithub.com\u002Fnk9) with `just` syntax and some other tools is\navailable on [PackageControl](https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FJust).\n\n### Micro\n\n[Micro](https:\u002F\u002Fmicro-editor.github.io\u002F) supports Justfile syntax highlighting\nout of the box, thanks to [tomodachi94](https:\u002F\u002Fgithub.com\u002Ftomodachi94).\n\n### Zed\n\nThe [zed-just](https:\u002F\u002Fgithub.com\u002FjackTabsCode\u002Fzed-just\u002F) extension by\n[jackTabsCode](https:\u002F\u002Fgithub.com\u002FjackTabsCode) is available on the\n[Zed extensions page](https:\u002F\u002Fzed.dev\u002Fextensions?query=just).\n\n### Other Editors\n\nFeel free to send me the commands necessary to get syntax highlighting working\nin your editor of choice so that I may include them here.\n\n### Language Server Protocol\n\n[just-lsp](https:\u002F\u002Fgithub.com\u002Fterror\u002Fjust-lsp) provides a [language server\nprotocol](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLanguage_Server_Protocol)\nimplementation, enabling features such as go-to-definition, inline diagnostics,\nand code completion.\n\n### Model Context Protocol\n\n[just-mcp](https:\u002F\u002Fgithub.com\u002Fpromptexecution\u002Fjust-mcp) provides a\n[model context protocol](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_Context_Protocol)\nadapter to allow LLMs to query the contents of `justfiles` and run recipes.\n\nQuick Start\n-----------\n\nSee the installation section for how to install `just` on your computer. Try\nrunning `just --version` to make sure that it's installed correctly.\n\nFor an overview of the syntax, check out\n[this cheatsheet](https:\u002F\u002Fcheatography.com\u002Flinux-china\u002Fcheat-sheets\u002Fjustfile\u002F).\n\nOnce `just` is installed and working, create a file named `justfile` in the\nroot of your project with the following contents:\n\n```just\nrecipe-name:\n  echo 'This is a recipe!'\n\n# this is a comment\nanother-recipe:\n  @echo 'This is another recipe.'\n```\n\nWhen you invoke `just`, it looks for a file named `justfile` in the current\ndirectory and upwards, so you can invoke it from any subdirectory of your\nproject.\n\nThe search for a `justfile` is case insensitive, so any case, like `Justfile`,\n`JUSTFILE`, or `JuStFiLe`, will work. `just` will also look for files with the\nname `.justfile`, in case you'd like to hide a `justfile`.\n\nRunning `just` with no arguments runs the first recipe in the `justfile`:\n\n```console\n$ just\necho 'This is a recipe!'\nThis is a recipe!\n```\n\nOne or more arguments specify the recipe(s) to run:\n\n```console\n$ just another-recipe\nThis is another recipe.\n```\n\n`just` prints each command to standard error before running it, which is why\n`echo 'This is a recipe!'` was printed. This is suppressed for lines starting\nwith `@`, which is why `echo 'This is another recipe.'` was not printed.\n\nRecipes stop running if a command fails. Here `cargo publish` will only run if\n`cargo test` succeeds:\n\n```just\npublish:\n  cargo test\n  # tests passed, time to publish!\n  cargo publish\n```\n\nRecipes can depend on other recipes. Here the `test` recipe depends on the\n`build` recipe, so `build` will run before `test`:\n\n```just\nbuild:\n  cc main.c foo.c bar.c -o main\n\ntest: build\n  .\u002Ftest\n\nsloc:\n  @echo \"`wc -l *.c` lines of code\"\n```\n\n```console\n$ just test\ncc main.c foo.c bar.c -o main\n.\u002Ftest\ntesting… all tests passed!\n```\n\nRecipes without dependencies will run in the order they're given on the command\nline:\n\n```console\n$ just build sloc\ncc main.c foo.c bar.c -o main\n1337 lines of code\n```\n\nDependencies will always run first, even if they are passed after a recipe that\ndepends on them:\n\n```console\n$ just test build\ncc main.c foo.c bar.c -o main\n.\u002Ftest\ntesting… all tests passed!\n```\n\nRecipes may depend on recipes in submodules:\n\n```justfile\nmod foo\n\nbaz: foo::bar\n```\n\nExamples\n--------\n\nA variety of `justfile`s can be found in the\n[examples directory](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Ftree\u002Fmaster\u002Fexamples) and on\n[GitHub](https:\u002F\u002Fgithub.com\u002Fsearch?q=path%3A**%2Fjustfile&type=code).\n\nFeatures\n--------\n\n### The Default Recipe\n\nWhen `just` is invoked without a recipe, it runs the recipe with the\n`[default]` attribute, or the first recipe in the `justfile` if no recipe has\nthe `[default]` attribute.\n\nThis recipe might be the most frequently run command in the project, like\nrunning the tests:\n\n```just\ntest:\n  cargo test\n```\n\nYou can also use dependencies to run multiple recipes by default:\n\n```just\ndefault: lint build test\n\nbuild:\n  echo Building…\n\ntest:\n  echo Testing…\n\nlint:\n  echo Linting…\n```\n\nIf no recipe makes sense as the default recipe, you can add a recipe to the\nbeginning of your `justfile` that lists the available recipes:\n\n```just\ndefault:\n  just --list\n```\n\n### Listing Available Recipes\n\nRecipes can be listed in alphabetical order with `just --list`:\n\n```console\n$ just --list\nAvailable recipes:\n    build\n    test\n    deploy\n    lint\n```\n\nRecipes in [submodules](#modules) can be listed with `just --list PATH`, where\n`PATH` is a space- or `::`-separated module path:\n\n```\n$ cat justfile\nmod foo\n$ cat foo.just\nmod bar\n$ cat bar.just\nbaz:\n$ just --list foo bar\nAvailable recipes:\n    baz\n$ just --list foo::bar\nAvailable recipes:\n    baz\n```\n\n`just --summary` is more concise:\n\n```console\n$ just --summary\nbuild test deploy lint\n```\n\nPass `--unsorted` to print recipes in the order they appear in the `justfile`:\n\n```just\ntest:\n  echo 'Testing!'\n\nbuild:\n  echo 'Building!'\n```\n\n```console\n$ just --list --unsorted\nAvailable recipes:\n    test\n    build\n```\n\n```console\n$ just --summary --unsorted\ntest build\n```\n\nIf you'd like `just` to default to listing the recipes in the `justfile`, you\ncan use this as your default recipe:\n\n```just\ndefault:\n  @just --list\n```\n\nNote that you may need to add `--justfile {{justfile()}}` to the line above.\nWithout it, if you executed `just -f \u002Fsome\u002Fdistant\u002Fjustfile -d .` or\n`just -f .\u002Fnon-standard-justfile`, the plain `just --list` inside the recipe\nwould not necessarily use the file you provided. It would try to find a\njustfile in your current path, maybe even resulting in a `No justfile found`\nerror.\n\nThe heading text can be customized with `--list-heading`:\n\n```console\n$ just --list --list-heading $'Cool stuff…\\n'\nCool stuff…\n    test\n    build\n```\n\nAnd the indentation can be customized with `--list-prefix`:\n\n```console\n$ just --list --list-prefix ····\nAvailable recipes:\n····test\n····build\n```\n\nThe argument to `--list-heading` replaces both the heading and the newline\nfollowing it, so it should contain a newline if non-empty. It works this way so\nyou can suppress the heading line entirely by passing the empty string:\n\n```console\n$ just --list --list-heading ''\n    test\n    build\n```\n\n### Invoking Multiple Recipes\n\nMultiple recipes may be invoked on the command line at once:\n\n```just\nbuild:\n  make web\n\nserve:\n  python3 -m http.server -d out 8000\n```\n\n```console\n$ just build serve\nmake web\npython3 -m http.server -d out 8000\n```\n\nKeep in mind that recipes with parameters will swallow arguments, even if they\nmatch the names of other recipes:\n\n```just\nbuild project:\n  make {{project}}\n\nserve:\n  python3 -m http.server -d out 8000\n```\n\n```console\n$ just build serve\nmake: *** No rule to make target `serve'.  Stop.\n```\n\nThe `--one` flag can be used to restrict command-line invocations to a single\nrecipe:\n\n```console\n$ just --one build serve\nerror: Expected 1 command-line recipe invocation but found 2.\n```\n\n### Working Directory\n\nBy default, recipes run with the working directory set to the directory that\ncontains the `justfile`.\n\nThe `[no-cd]` attribute can be used to make recipes run with the working\ndirectory set to the directory in which `just` was invoked.\n\n```just\n@foo:\n  pwd\n\n[no-cd]\n@bar:\n  pwd\n```\n\n```console\n$ cd subdir\n$ just foo\n\u002F\n$ just bar\n\u002Fsubdir\n```\n\nUse `set no-cd`\u003Csup>master\u003C\u002Fsup> to make all recipes in the current module\ndefault to the same behavior.\n\n`set no-cd` and `set working-directory` can be overridden on a per-recipe basis\nwith the `[no-cd]` and `[working-directory]` attributes.\n\nYou can override the working directory for all recipes with\n`set working-directory := '…'`:\n\n```just\nset working-directory := 'bar'\n\n@foo:\n  pwd\n```\n\n```console\n$ pwd\n\u002Fhome\u002Fbob\n$ just foo\n\u002Fhome\u002Fbob\u002Fbar\n```\n\nYou can override the working directory for a specific recipe with the\n`working-directory` attribute\u003Csup>1.38.0\u003C\u002Fsup>:\n\n```just\n[working-directory: 'bar']\n@foo:\n  pwd\n```\n\n```console\n$ pwd\n\u002Fhome\u002Fbob\n$ just foo\n\u002Fhome\u002Fbob\u002Fbar\n```\n\nThe argument to the `working-directory` setting or `working-directory`\nattribute may be absolute or relative. If it is relative it is interpreted\nrelative to the default working directory.\n\n### Aliases\n\nAliases allow recipes to be invoked on the command line with alternative names:\n\n```just\nalias b := build\n\nbuild:\n  echo 'Building!'\n```\n\n```console\n$ just b\necho 'Building!'\nBuilding!\n```\n\nThe target of an alias may be a recipe in a submodule:\n\n```justfile\nmod foo\n\nalias baz := foo::bar\n```\n\n### Settings\n\nSettings control interpretation and execution. Each setting may be specified at\nmost once, anywhere in the `justfile`.\n\nFor example:\n\n```just\nset shell := [\"zsh\", \"-cu\"]\n\nfoo:\n  # this line will be run as `zsh -cu 'ls **\u002F*.txt'`\n  ls **\u002F*.txt\n```\n\n#### Table of Settings\n\n| Name | Value | Default | Description |\n|------|-------|---------|-------------|\n| `allow-duplicate-recipes` | boolean | `false` | Allow recipes appearing later in a `justfile` to override earlier recipes with the same name. |\n| `allow-duplicate-variables` | boolean | `false` | Allow variables appearing later in a `justfile` to override earlier variables with the same name. |\n| `dotenv-filename` | string | - | Load a `.env` file with a custom name, if present. |\n| `dotenv-load` | boolean | `false` | Load a `.env` file, if present. |\n| `dotenv-override` | boolean | `false` | Override existing environment variables with values from the `.env` file. |\n| `dotenv-path` | string | - | Load a `.env` file from a custom path and error if not present. Overrides `dotenv-filename`. |\n| `dotenv-required` | boolean | `false` | Error if a `.env` file isn't found. |\n| `export` | boolean | `false` | Export all variables as environment variables. |\n| `fallback` | boolean | `false` | Search `justfile` in parent directory if the first recipe on the command line is not found. |\n| `ignore-comments` | boolean | `false` | Ignore recipe lines beginning with `#`. |\n| `no-exit-message`\u003Csup>1.39.0\u003C\u002Fsup> | boolean | `false` | Don't print exit messages if recipes fail. |\n| `lazy`\u003Csup>1.47.0\u003C\u002Fsup> | boolean | `false` | Don't evaluate unused variables. |\n| `no-cd`\u003Csup>master\u003C\u002Fsup> | boolean | `false` | Don't change directory when executing recipes by recipe attribute. |\n| `positional-arguments` | boolean | `false` | Pass positional arguments. |\n| `quiet` | boolean | `false` | Disable echoing recipe lines before executing. |\n| `script-interpreter`\u003Csup>1.33.0\u003C\u002Fsup> | `[COMMAND, ARGS…]` | `['sh', '-eu']` | Set command used to invoke recipes with empty `[script]` attribute. |\n| `shell` | `[COMMAND, ARGS…]` | - | Set command used to invoke recipes and evaluate backticks. |\n| `tempdir` | string | - | Create temporary directories in `tempdir` instead of the system default temporary directory. |\n| `unstable`\u003Csup>1.31.0\u003C\u002Fsup> | boolean | `false` | Enable unstable features. |\n| `windows-powershell` | boolean | `false` | Use PowerShell on Windows as default shell. (Deprecated. Use `windows-shell` instead.) |\n| `windows-shell` | `[COMMAND, ARGS…]` | - | Set the command used to invoke recipes and evaluate backticks. |\n| `working-directory`\u003Csup>1.33.0\u003C\u002Fsup> | string | - | Set the working directory for recipes and backticks, relative to the default working directory. |\n\nBoolean settings can be written as:\n\n```justfile\nset NAME\n```\n\nWhich is equivalent to:\n\n```justfile\nset NAME := true\n```\n\nNon-boolean settings can be set to both strings and\nexpressions\u003Csup>1.46.0\u003C\u002Fsup>.\n\nHowever, because settings affect the behavior of backticks and many functions,\nthose expressions may not contain backticks or function calls, directly or\ntransitively via reference.\n\n#### Allow Duplicate Recipes\n\nIf `allow-duplicate-recipes` is set to `true`, defining multiple recipes with\nthe same name is not an error and the last definition is used. Defaults to\n`false`.\n\n```just\nset allow-duplicate-recipes\n\n@foo:\n  echo foo\n\n@foo:\n  echo bar\n```\n\n```console\n$ just foo\nbar\n```\n\n#### Allow Duplicate Variables\n\nIf `allow-duplicate-variables` is set to `true`, defining multiple variables\nwith the same name is not an error and the last definition is used. Defaults to\n`false`.\n\n```just\nset allow-duplicate-variables\n\na := \"foo\"\na := \"bar\"\n\n@foo:\n  echo {{a}}\n```\n\n```console\n$ just foo\nbar\n```\n\n#### Dotenv Settings\n\nIf any of `dotenv-load`, `dotenv-filename`, `dotenv-override`, `dotenv-path`,\nor `dotenv-required` are set, `just` will try to load environment variables\nfrom a file.\n\nIf `dotenv-path` is set, `just` will look for a file at the given path, which\nmay be absolute, or relative to the working directory.\n\nThe command-line option `--dotenv-path`, short form `-E`, can be used to set or\noverride `dotenv-path` at runtime.\n\nIf `dotenv-filename` is set, `just` will look for a file at the given path,\nrelative to the working directory and each of its ancestors.\n\nIf `dotenv-filename` is not set, but `dotenv-load` or `dotenv-required` are\nset, `just` will look for a file named `.env`, relative to the working directory\nand each of its ancestors.\n\n`dotenv-filename` and `dotenv-path` are similar, but `dotenv-path` is only\nchecked relative to the working directory, whereas `dotenv-filename` is checked\nrelative to the working directory and each of its ancestors.\n\nIt is not an error if an environment file is not found, unless\n`dotenv-required` is set.\n\nThe loaded variables are environment variables, not `just` variables, and so\nmust be accessed using `$VARIABLE_NAME` in recipes and backticks.\n\nIf `dotenv-override` is set, variables from the environment file will override\nexisting environment variables.\n\nFor example, if your `.env` file contains:\n\n```console\n# a comment, will be ignored\nDATABASE_ADDRESS=localhost:6379\nSERVER_PORT=1337\n```\n\nAnd your `justfile` contains:\n\n```just\nset dotenv-load\n\nserve:\n  @echo \"Starting server with database $DATABASE_ADDRESS on port $SERVER_PORT…\"\n  .\u002Fserver --database $DATABASE_ADDRESS --port $SERVER_PORT\n```\n\n`just serve` will output:\n\n```console\n$ just serve\nStarting server with database localhost:6379 on port 1337…\n.\u002Fserver --database $DATABASE_ADDRESS --port $SERVER_PORT\n```\n\nVariables in environment files loaded in parent modules are inherited by\nsubmodules.\n\nEnvironment files are loaded in submodules\u003Csup>1.49.0\u003C\u002Fsup> and may override\nvariables defined in parent module environment files.\n\n#### Export\n\nThe `export` setting causes all `just` variables to be exported as environment\nvariables. Defaults to `false`.\n\n```just\nset export\n\na := \"hello\"\n\n@foo b:\n  echo $a\n  echo $b\n```\n\n```console\n$ just foo goodbye\nhello\ngoodbye\n```\n\n#### Lazy\n\nThe `lazy` setting\u003Csup>1.47.0\u003C\u002Fsup> causes the evaluator to skip evaluating\nunused variables. This can be beneficial when a `justfile` contains variables\nthat are expensive to evaluate but only sometimes used.\n\nIn the following `justfile`, `token` will be skipped when only invoking `bar`:\n\n```just\nset lazy\n\ntoken := `expensive-script-to-get-credentials`\n\nfoo:\n  curl -H \"Authorization: Bearer {{ token }}\" https:\u002F\u002Fexample.com\u002Ffoo\n\nbar:\n  cargo test\n```\n\nBecause `just` cannot determine when exported variables are used, assignments\nwith `export` and assignments in a module with `set export` will always be\nevaluated.\n\n#### Positional Arguments\n\nIf `positional-arguments` is `true`, recipe arguments will be passed as\npositional arguments to commands. For linewise recipes, argument `$0` will be\nthe name of the recipe.\n\nFor example, running this recipe:\n\n```just\nset positional-arguments\n\n@foo bar:\n  echo $0\n  echo $1\n```\n\nWill produce the following output:\n\n```console\n$ just foo hello\nfoo\nhello\n```\n\nWhen using an `sh`-compatible shell, such as `bash` or `zsh`, `$@` expands to\nthe positional arguments given to the recipe, starting from one. When used\nwithin double quotes as `\"$@\"`, arguments including whitespace will be passed\non as if they were double-quoted. That is, `\"$@\"` is equivalent to `\"$1\" \"$2\"`…\nWhen there are no positional parameters, `\"$@\"` and `$@` expand to nothing\n(i.e., they are removed).\n\nThis example recipe will print arguments one by one on separate lines:\n\n```just\nset positional-arguments\n\n@test *args='':\n  bash -c 'while (( \"$#\" )); do echo - $1; shift; done' -- \"$@\"\n```\n\nRunning it with _two_ arguments:\n\n```console\n$ just test foo \"bar baz\"\n- foo\n- bar baz\n```\n\nPositional arguments may also be turned on a per-recipe basis with the\n`[positional-arguments]` attribute\u003Csup>1.29.0\u003C\u002Fsup>:\n\n```just\n[positional-arguments]\n@foo bar:\n  echo $0\n  echo $1\n```\n\nNote that PowerShell does not handle positional arguments in the same way as\nother shells, so turning on positional arguments will likely break recipes that\nuse PowerShell.\n\nIf using PowerShell 7.4 or better, the `-CommandWithArgs` flag will make\npositional arguments work as expected:\n\n```just\nset shell := ['pwsh.exe', '-CommandWithArgs']\nset positional-arguments\n\nprint-args a b c:\n  Write-Output @($args[1..($args.Count - 1)])\n```\n\n#### Shell\n\nThe `shell` setting controls the command used to invoke recipe lines and\nbackticks. Shebang recipes are unaffected. The default shell is `sh -cu`.\n\n```just\n# use python3 to execute recipe lines and backticks\nset shell := [\"python3\", \"-c\"]\n\n# use print to capture result of evaluation\nfoos := `print(\"foo\" * 4)`\n\nfoo:\n  print(\"Snake snake snake snake.\")\n  print(\"{{foos}}\")\n```\n\n`just` passes the command to be executed as an argument. Many shells will need\nan additional flag, often `-c`, to make them evaluate the first argument.\n\n##### Windows Shell\n\n`just` uses `sh` on Windows by default. To use a different shell on Windows,\nuse `windows-shell`:\n\n```just\nset windows-shell := [\"powershell.exe\", \"-NoLogo\", \"-Command\"]\n\nhello:\n  Write-Host \"Hello, world!\"\n```\n\nSee\n[powershell.just](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Fblob\u002Fmaster\u002Fexamples\u002Fpowershell.just)\nfor a justfile that uses PowerShell on all platforms.\n\n##### Windows PowerShell\n\n*`set windows-powershell` uses the legacy `powershell.exe` binary, and is no\nlonger recommended. See the `windows-shell` setting above for a more flexible\nway to control which shell is used on Windows.*\n\n`just` uses `sh` on Windows by default. To use `powershell.exe` instead, set\n`windows-powershell` to true.\n\n```just\nset windows-powershell := true\n\nhello:\n  Write-Host \"Hello, world!\"\n```\n\n##### Python 3\n\n```just\nset shell := [\"python3\", \"-c\"]\n```\n\n##### Bash\n\n```just\nset shell := [\"bash\", \"-uc\"]\n```\n\n##### Z Shell\n\n```just\nset shell := [\"zsh\", \"-uc\"]\n```\n\n##### Fish\n\n```just\nset shell := [\"fish\", \"-c\"]\n```\n\n##### Nushell\n\n```just\nset shell := [\"nu\", \"-c\"]\n```\n\nIf you want to change the default table mode to `light`:\n\n```just\nset shell := ['nu', '-m', 'light', '-c']\n```\n\n*[Nushell](https:\u002F\u002Fgithub.com\u002Fnushell\u002Fnushell) was written in Rust, and **has\ncross-platform support for Windows \u002F macOS and Linux**.*\n\n### Documentation Comments\n\nComments immediately preceding a recipe will appear in `just --list`:\n\n```just\n# build stuff\nbuild:\n  .\u002Fbin\u002Fbuild\n\n# test stuff\ntest:\n  .\u002Fbin\u002Ftest\n```\n\n```console\n$ just --list\nAvailable recipes:\n    build # build stuff\n    test # test stuff\n```\n\nThe `[doc]` attribute can be used to set or suppress a recipe's doc comment:\n\n```just\n# This comment won't appear\n[doc('Build stuff')]\nbuild:\n  .\u002Fbin\u002Fbuild\n\n# This one won't either\n[doc]\ntest:\n  .\u002Fbin\u002Ftest\n```\n\n```console\n$ just --list\nAvailable recipes:\n    build # Build stuff\n    test\n```\n\n### Variables and Assignments\n\nModule-level variables may be created by assigning them a value with `:=`:\n\n```just\nfoo := \"hello\"\nbar := \"world\"\n\nbaz:\n  echo {{ foo + \" \" + bar }}\n```\n\nAll variables in a module may be printed:\n\n```console\n$ just --evaluate\nbar := \"world\"\nfoo := \"hello\"\n```\n\nOr the value of a single variable:\n\n```console\n$ just --evaluate foo\nhello\n```\n\nAll variables in a submodule or a single variable in a submodule may be printed\nwith a path to the submodule or variable\u003Csup>1.49.0\u003C\u002Fsup>:\n\n```console\n$ just --evaluate bob::bar\nx := \"world\"\ny := \"hello\"\n$ just --evaluate bob::bar::y\nhello\n```\n\nThe format of exported variables may be controlled with\n`--evaluate-format`\u003Csup>1.49.0\u003C\u002Fsup>:\n\n```console\n$ just --evaluate --evaluate-format shell\nbar=\"world\"\nfoo=\"hello\"\n```\n\nThe default format is `--evaluate-format just`:\n\n```console\n$ just --evaluate --evaluate-format just\nbar := \"world\"\nfoo := \"hello\"\n```\n\n### Expressions and Substitutions\n\nVarious operators and function calls are supported in expressions, which may be\nused in assignments, default recipe arguments, and inside recipe body `{{…}}`\nsubstitutions.\n\n```just\ntmpdir  := `mktemp -d`\nversion := \"0.2.7\"\ntardir  := tmpdir \u002F \"awesomesauce-\" + version\ntarball := tardir + \".tar.gz\"\nconfig  := quote(config_dir() \u002F \".project-config\")\n\npublish:\n  rm -f {{tarball}}\n  mkdir {{tardir}}\n  cp README.md *.c {{ config }} {{tardir}}\n  tar zcvf {{tarball}} {{tardir}}\n  scp {{tarball}} me@server.com:release\u002F\n  rm -rf {{tarball}} {{tardir}}\n```\n\n#### Concatenation\n\nThe `+` operator returns the left-hand argument concatenated with the\nright-hand argument:\n\n```just\nfoobar := 'foo' + 'bar'\n```\n\n#### Logical Operators\n\nThe logical operators `&&` and `||` can be used to coalesce string\nvalues\u003Csup>1.37.0\u003C\u002Fsup>, similar to Python's `and` and `or`. These operators\nconsider the empty string `''` to be false, and all other strings to be true.\n\nThese operators are currently unstable.\n\nThe `&&` operator returns the empty string if the left-hand argument is the\nempty string, otherwise it returns the right-hand argument:\n\n```justfile\nfoo := '' && 'goodbye'      # ''\nbar := 'hello' && 'goodbye' # 'goodbye'\n```\n\nThe `||` operator returns the left-hand argument if it is non-empty, otherwise\nit returns the right-hand argument:\n\n```justfile\nfoo := '' || 'goodbye'      # 'goodbye'\nbar := 'hello' || 'goodbye' # 'hello'\n```\n\n#### Joining Paths\n\nThe `\u002F` operator can be used to join two strings with a slash:\n\n```just\nfoo := \"a\" \u002F \"b\"\n```\n\n```\n$ just --evaluate foo\na\u002Fb\n```\n\nNote that a `\u002F` is added even if one is already present:\n\n```just\nfoo := \"a\u002F\"\nbar := foo \u002F \"b\"\n```\n\n```\n$ just --evaluate bar\na\u002F\u002Fb\n```\n\nAbsolute paths can also be constructed\u003Csup>1.5.0\u003C\u002Fsup>:\n\n```just\nfoo := \u002F \"b\"\n```\n\n```\n$ just --evaluate foo\n\u002Fb\n```\n\nThe `\u002F` operator uses the `\u002F` character, even on Windows. Thus, using the `\u002F`\noperator should be avoided with paths that use universal naming convention\n(UNC), i.e., those that start with `\\\\`, since forward slashes are not\nsupported with UNC paths.\n\n#### Escaping `{{`\n\nTo write a recipe containing `{{`, use `{{{{`:\n\n```just\nbraces:\n  echo 'I {{{{LOVE}} curly braces!'\n```\n\n(An unmatched `}}` is ignored, so it doesn't need to be escaped.)\n\nAnother option is to put all the text you'd like to escape inside of an\ninterpolation:\n\n```just\nbraces:\n  echo '{{'I {{LOVE}} curly braces!'}}'\n```\n\nYet another option is to use `{{ \"{{\" }}`:\n\n```just\nbraces:\n  echo 'I {{ \"{{\" }}LOVE}} curly braces!'\n```\n\n### Strings\n\n`'single'`, `\"double\"`, and `'''triple'''` quoted string literals are\nsupported. Unlike in recipe bodies, `{{…}}` interpolations are not supported\ninside strings.\n\nDouble-quoted strings support escape sequences:\n\n```just\ncarriage-return   := \"\\r\"\ndouble-quote      := \"\\\"\"\nnewline           := \"\\n\"\nno-newline        := \"\\\n\"\nslash             := \"\\\\\"\ntab               := \"\\t\"\nunicode-codepoint := \"\\u{1F916}\"\n```\n\n```console\n$ just --evaluate\n\"arriage-return   := \"\ndouble-quote      := \"\"\"\nnewline           := \"\n\"\nno-newline        := \"\"\nslash             := \"\\\"\ntab               := \"     \"\nunicode-codepoint := \"🤖\"\n```\n\nThe unicode character escape sequence `\\u{…}`\u003Csup>1.36.0\u003C\u002Fsup> accepts up to\nsix hex digits.\n\nStrings may contain line breaks:\n\n```just\nsingle := '\nhello\n'\n\ndouble := \"\ngoodbye\n\"\n```\n\nSingle-quoted strings do not recognize escape sequences:\n\n```just\nescapes := '\\t\\n\\r\\\"\\\\'\n```\n\n```console\n$ just --evaluate\nescapes := \"\\t\\n\\r\\\"\\\\\"\n```\n\nIndented versions of both single- and double-quoted strings, delimited by\ntriple single- or double-quotes, are supported. Indented string lines are\nstripped of a leading line break, and leading whitespace common to all\nnon-blank lines:\n\n```just\n# this string will evaluate to `foo\\nbar\\n`\nx := '''\n  foo\n  bar\n'''\n\n# this string will evaluate to `abc\\n  wuv\\nxyz\\n`\ny := \"\"\"\n  abc\n    wuv\n  xyz\n\"\"\"\n```\n\nSimilar to unindented strings, indented double-quoted strings process escape\nsequences, and indented single-quoted strings ignore escape sequences. Escape\nsequence processing takes place after unindentation. The unindentation\nalgorithm does not take escape-sequence produced whitespace or newlines into\naccount.\n\n#### Shell-expanded strings\n\nStrings prefixed with `x` are shell expanded\u003Csup>1.27.0\u003C\u002Fsup>:\n\n```justfile\nfoobar := x'~\u002F$FOO\u002F${BAR}'\n```\n\n| Value | Replacement |\n|------|-------------|\n| `$VAR` | value of environment variable `VAR` |\n| `${VAR}` | value of environment variable `VAR` |\n| `${VAR:-DEFAULT}` | value of environment variable `VAR`, or `DEFAULT` if `VAR` is not set |\n| Leading `~` | path to current user's home directory |\n| Leading `~USER` | path to `USER`'s home directory |\n\nThis expansion is performed at compile time, so variables from `.env` files and\nexported `just` variables cannot be used. However, this allows shell expanded\nstrings to be used in places like settings and import paths, which cannot\ndepend on `just` variables and `.env` files.\n\n#### Format strings\n\nStrings prefixed with `f` are format strings\u003Csup>1.44.0\u003C\u002Fsup>:\n\n```justfile\nname := \"world\"\nmessage := f'Hello, {{name}}!'\n```\n\nFormat strings may contain interpolations delimited with `{{…}}` that contain\nexpressions. Format strings evaluate to the concatenated string fragments and\nevaluated expressions.\n\nUse `{{{{` to include a literal `{{` in a format string:\n\n```justfile\nfoo := f'I {{{{LOVE} curly braces!'\n```\n\n### Sigils\n\nCommands in linewise recipes may be prefixed with any combination of the sigils\n`-`, `@`, and `?`.\n\nThe `@` sigil toggles command echoing:\n\n```just\nfoo:\n  @echo \"This line won't be echoed!\"\n  echo \"This line will be echoed!\"\n\n@bar:\n  @echo \"This line will be echoed!\"\n  echo \"This line won't be echoed!\"\n```\n\nThe `-` sigil causes recipe execution to continue even if the command returns a\nnonzero exit status:\n\n```just\n# execution will continue, even if bar doesn't exist\nfoo:\n  -rmdir bar\n  mkdir bar\n  echo 'so much good stuff' > bar\u002Fstuff.txt\n```\n\nThe `?` sigil\u003Csup>1.47.0\u003C\u002Fsup> causes the current recipe to stop executing if\nthe command exits with status code `1`, however execution of other recipes will\ncontinue. Exit status `0` causes the current recipe to continue execution as\nnormal. All other exit codes are reserved and should not be used, as they may\nbe given meaning in a future version of `just`.\n\nIf the `guards` setting is unset or false, `?` sigils are ignored and instead\ntreated as part of the command.\n\n```just\nset guards\n\n@foo: bar\n  echo FOO\n\n@bar:\n  ?[[ -f baz ]]\n  echo BAR\n```\n\n```console\n$ just foo\nFOO\n$ touch baz\n$ just foo\nBAR\nFOO\n```\n\n### Built-in Functions\n\n`just` provides many built-in functions for use in expressions, including\nrecipe body `{{…}}` substitutions, assignments, and default parameter values.\n\nAll functions ending in `_directory` can be abbreviated to `_dir`. So\n`home_directory()` can also be written as `home_dir()`. In addition,\n`invocation_directory_native()` can be abbreviated to\n`invocation_dir_native()`.\n\n#### System Information\n\n- `arch()` — Instruction set architecture. Possible values are: `\"aarch64\"`,\n  `\"arm\"`, `\"asmjs\"`, `\"hexagon\"`, `\"mips\"`, `\"msp430\"`, `\"powerpc\"`,\n  `\"powerpc64\"`, `\"s390x\"`, `\"sparc\"`, `\"wasm32\"`, `\"x86\"`, `\"x86_64\"`, and\n  `\"xcore\"`.\n- `num_cpus()`\u003Csup>1.15.0\u003C\u002Fsup> — Number of logical CPUs.\n- `os()` — Operating system. Possible values are: `\"android\"`, `\"bitrig\"`,\n  `\"dragonfly\"`, `\"emscripten\"`, `\"freebsd\"`, `\"haiku\"`, `\"ios\"`, `\"linux\"`,\n  `\"macos\"`, `\"netbsd\"`, `\"openbsd\"`, `\"solaris\"`, and `\"windows\"`.\n- `os_family()` — Operating system family; possible values are: `\"unix\"` and\n  `\"windows\"`.\n\nFor example:\n\n```just\nsystem-info:\n  @echo \"This is an {{arch()}} machine.\"\n```\n\n```console\n$ just system-info\nThis is an x86_64 machine.\n```\n\nThe `os_family()` function can be used to create cross-platform `justfile`s\nthat work on various operating systems. For an example, see\n[cross-platform.just](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust\u002Fblob\u002Fmaster\u002Fexamples\u002Fcross-platform.just)\nfile.\n\n#### External Commands\n\n- `shell(command, args...)`\u003Csup>1.27.0\u003C\u002Fsup> returns the standard output of shell script\n  `command` with zero or more positional arguments `args`. The shell used to\n  interpret `command` is the same shell that is used to evaluate recipe lines,\n  and can be changed with `set shell := […]`.\n\n  `command` is passed as the first argument, so if the command is `'echo $@'`,\n  the full command line, with the default shell command `sh -cu` and `args`\n  `'foo'` and `'bar'` will be:\n\n  ```\n  'sh' '-cu' 'echo $@' 'echo $@' 'foo' 'bar'\n  ```\n\n  This is so that `$@` works as expected, and `$1` refers to the first\n  argument. `$@` does not include the first positional argument, which is\n  expected to be the name of the program being run.\n\n```just\n# arguments can be variables or expressions\nfile := '\u002Fsys\u002Fclass\u002Fpower_supply\u002FBAT0\u002Fstatus'\nbat0stat := shell('cat $1', file)\n\n# commands can be variables or expressions\ncommand := 'wc -l'\noutput := shell(command + ' \"$1\"', 'main.c')\n\n# arguments referenced by the shell command must be used\nempty := shell('echo', 'foo')\nfull := shell('echo $1', 'foo')\nerror := shell('echo $1')\n```\n\n```just\n# Using python as the shell. Since `python -c` sets `sys.argv[0]` to `'-c'`,\n# the first \"real\" positional argument will be `sys.argv[2]`.\nset shell := [\"python3\", \"-c\"]\nolleh := shell('import sys; print(sys.argv[2][::-1])', 'hello')\n```\n\n#### Environment Variables\n\n- `env(key)`\u003Csup>1.15.0\u003C\u002Fsup> — Retrieves the environment variable with name `key`, aborting\n  if it is not present.\n\n```just\nhome_dir := env('HOME')\n\ntest:\n  echo \"{{home_dir}}\"\n```\n\n```console\n$ just\n\u002Fhome\u002Fuser1\n```\n\n- `env(key, default)`\u003Csup>1.15.0\u003C\u002Fsup> — Retrieves the environment variable with\n  name `key`, returning `default` if it is not present.\n- `env_var(key)` — Deprecated alias for `env(key)`.\n- `env_var_or_default(key, default)` — Deprecated alias for `env(key, default)`.\n\nA default can be substituted for an empty environment variable value with the\n`||` operator, currently unstable:\n\n```just\nset unstable\n\nfoo := env('FOO', '') || 'DEFAULT_VALUE'\n```\n\n#### Executables\n\n- `require(name)`\u003Csup>1.39.0\u003C\u002Fsup> — Search directories in the `PATH`\n  environment variable for the executable `name` and return its full path, or\n  halt with an error if no executable with `name` exists.\n\n  ```just\n  bash := require(\"bash\")\n\n  @test:\n      echo \"bash: '{{bash}}'\"\n  ```\n\n  ```console\n  $ just\n  bash: '\u002Fbin\u002Fbash'\n  ```\n\n- `which(name)`\u003Csup>1.39.0\u003C\u002Fsup> — Search directories in the `PATH` environment\n  variable for the executable `name` and return its full path, or the empty\n  string if no executable with `name` exists. Currently unstable.\n\n\n  ```just\n  set unstable\n\n  bosh := which(\"bosh\")\n\n  @test:\n      echo \"bosh: '{{bosh}}'\"\n  ```\n\n  ```console\n  $ just\n  bosh: ''\n  ```\n\n#### Invocation Information\n\n- `is_dependency()` - Returns the string `true` if the current recipe is being\n  run as a dependency of another recipe, rather than being run directly,\n  otherwise returns the string `false`.\n\n#### Invocation Directory\n\n- `invocation_directory()` - Retrieves the absolute path to the current\n  directory when `just` was invoked, before `just` changed it (chdir'd) prior\n  to executing commands. On Windows, `invocation_directory()` uses `cygpath` to\n  convert the invocation directory to a Cygwin-compatible `\u002F`-separated path.\n  Use `invocation_directory_native()` to return the verbatim invocation\n  directory on all platforms.\n\nFor example, to call `rustfmt` on files just under the \"current directory\"\n(from the user\u002Finvoker's perspective), use the following recipe:\n\n```just\nrustfmt:\n  find {{invocation_directory()}} -name \\*.rs -exec rustfmt {} \\;\n```\n\nAlternatively, if your command needs to be run from the current directory, you\ncould use (e.g.):\n\n```just\nbuild:\n  cd {{invocation_directory()}}; .\u002Fsome_script_that_needs_to_be_run_from_here\n```\n\n- `invocation_directory_native()` - Retrieves the absolute path to the current\n  directory when `just` was invoked, before `just` changed it (chdir'd) prior\n  to executing commands.\n\n#### Justfile and Justfile Directory\n\n- `justfile()` - Retrieves the path of the current `justfile`.\n\n- `justfile_directory()` - Retrieves the path of the parent directory of the\n  current `justfile`.\n\nFor example, to run a command relative to the location of the current\n`justfile`:\n\n```just\nscript:\n  {{justfile_directory()}}\u002Fscripts\u002Fsome_script\n```\n\n#### Source and Source Directory\n\n- `source_file()`\u003Csup>1.27.0\u003C\u002Fsup> - Retrieves the path of the current source file.\n\n- `source_directory()`\u003Csup>1.27.0\u003C\u002Fsup> - Retrieves the path of the parent directory of the\n  current source file.\n\n`source_file()` and `source_directory()` behave the same as `justfile()` and\n`justfile_directory()` in the root `justfile`, but will return the path and\ndirectory, respectively, of the current `import` or `mod` source file when\ncalled from within an import or submodule.\n\n#### Module and Module Directory\n\n- `module_file()` - Returns the path of the current module file.\n\n- `module_directory()` - Returns the path of the parent directory of the\n  current module file.\n\n- `module_path()` - Returns the `::`-separated path to the current module.\n\n`module_file()` and `module_directory()` behave the same as `justfile()` and\n`justfile_directory()` in the root `justfile`, but will return the path and\ndirectory, respectively, of the current `mod` source file when called from\nwithin a submodule.\n\n#### Just Executable\n\n- `just_executable()` - Absolute path to the `just` executable.\n\nFor example:\n\n```just\nexecutable:\n  @echo The executable is at: {{just_executable()}}\n```\n\n```console\n$ just\nThe executable is at: \u002Fbin\u002Fjust\n```\n\n#### Just Process ID\n\n- `just_pid()` - Process ID of the `just` executable.\n\nFor example:\n\n```just\npid:\n  @echo The process ID is: {{ just_pid() }}\n```\n\n```console\n$ just\nThe process ID is: 420\n```\n\n#### String Manipulation\n\n- `append(suffix, s)`\u003Csup>1.27.0\u003C\u002Fsup> - Append `suffix` to whitespace-separated\n  strings in `s`. `append('\u002Fsrc', 'foo bar baz')` → `'foo\u002Fsrc bar\u002Fsrc baz\u002Fsrc'`\n- `prepend(prefix, s)`\u003Csup>1.27.0\u003C\u002Fsup> - Prepend `prefix` to\n  whitespace-separated strings in `s`. `prepend('src\u002F', 'foo bar baz')` →\n  `'src\u002Ffoo src\u002Fbar src\u002Fbaz'`\n- `encode_uri_component(s)`\u003Csup>1.27.0\u003C\u002Fsup> - Percent-encode characters in `s`\n  except `[A-Za-z0-9_.!~*'()-]`, matching the behavior of the\n  [JavaScript `encodeURIComponent` function](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FencodeURIComponent).\n- `quote(s)` - Replace all single quotes with `'\\''` and prepend and append\n  single quotes to `s`. This is sufficient to escape special characters for\n  many shells, including most Bourne shell descendants.\n- `replace(s, from, to)` - Replace all occurrences of `from` in `s` with `to`.\n- `replace_regex(s, regex, replacement)` - Replace all occurrences of `regex`\n  in `s` with `replacement`. Regular expressions are provided by the\n  [Rust `regex` crate](https:\u002F\u002Fdocs.rs\u002Fregex\u002Flatest\u002Fregex\u002F). See the\n  [syntax documentation](https:\u002F\u002Fdocs.rs\u002Fregex\u002Flatest\u002Fregex\u002F#syntax) for usage\n  examples. Capture groups are supported. The `replacement` string uses\n  [Replacement string syntax](https:\u002F\u002Fdocs.rs\u002Fregex\u002Flatest\u002Fregex\u002Fstruct.Regex.html#replacement-string-syntax).\n- `trim(s)` - Remove leading and trailing whitespace from `s`.\n- `trim_end(s)` - Remove trailing whitespace from `s`.\n- `trim_end_match(s, substring)` - Remove suffix of `s` matching `substring`.\n- `trim_end_matches(s, substring)` - Repeatedly remove suffixes of `s` matching\n  `substring`.\n- `trim_start(s)` - Remove leading whitespace from `s`.\n- `trim_start_match(s, substring)` - Remove prefix of `s` matching `substring`.\n- `trim_start_matches(s, substring)` - Repeatedly remove prefixes of `s`\n  matching `substring`.\n\n#### Case Conversion\n\n- `capitalize(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert first character of `s` to uppercase\n  and the rest to lowercase.\n- `kebabcase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `kebab-case`.\n- `lowercamelcase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `lowerCamelCase`.\n- `lowercase(s)` - Convert `s` to lowercase.\n- `shoutykebabcase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `SHOUTY-KEBAB-CASE`.\n- `shoutysnakecase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `SHOUTY_SNAKE_CASE`.\n- `snakecase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `snake_case`.\n- `titlecase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `Title Case`.\n- `uppercamelcase(s)`\u003Csup>1.7.0\u003C\u002Fsup> - Convert `s` to `UpperCamelCase`.\n- `uppercase(s)` - Convert `s` to uppercase.\n\n#### Path Manipulation\n\n##### Fallible\n\n- `absolute_path(path)` - Absolute path to relative `path` in the working\n  directory. `absolute_path(\".\u002Fbar.txt\")` in directory `\u002Ffoo` is\n  `\u002Ffoo\u002Fbar.txt`.\n- `canonicalize(path)`\u003Csup>1.24.0\u003C\u002Fsup> - Canonicalize `path` by resolving symlinks and removing\n  `.`, `..`, and extra `\u002F`s where possible.\n- `extension(path)` - Extension of `path`. `extension(\"\u002Ffoo\u002Fbar.txt\")` is\n  `txt`.\n- `file_name(path)` - File name of `path` with any leading directory components\n  removed. `file_name(\"\u002Ffoo\u002Fbar.txt\")` is `bar.txt`.\n- `file_stem(path)` - File name of `path` without extension.\n  `file_stem(\"\u002Ffoo\u002Fbar.txt\")` is `bar`.\n- `parent_directory(path)` - Parent directory of `path`.\n  `parent_directory(\"\u002Ffoo\u002Fbar.txt\")` is `\u002Ffoo`.\n- `without_extension(path)` - `path` without extension.\n  `without_extension(\"\u002Ffoo\u002Fbar.txt\")` is `\u002Ffoo\u002Fbar`.\n\nThese functions can fail, for example if a path does not have an extension,\nwhich will halt execution.\n\n##### Infallible\n\n- `clean(path)` - Simplify `path` by removing extra path separators,\n  intermediate `.` components, and `..` where possible. `clean(\"foo\u002F\u002Fbar\")` is\n  `foo\u002Fbar`, `clean(\"foo\u002F..\")` is `.`, `clean(\"foo\u002F.\u002Fbar\")` is `foo\u002Fbar`.\n- `join(a, b…)` - *This function uses `\u002F` on Unix and `\\` on Windows, which can\n  lead to unwanted behavior. The `\u002F` operator, e.g., `a \u002F b`, which always\n  uses `\u002F`, should be considered as a replacement unless `\\`s are specifically\n  desired on Windows.* Join path `a` with path `b`. `join(\"foo\u002Fbar\", \"baz\")` is\n  `foo\u002Fbar\u002Fbaz`. Accepts two or more arguments.\n\n#### Filesystem Access\n\n- `path_exists(path)` - Returns the string `true` if the path points at an\n  existing entity and the string `false` otherwise. Traverses symbolic links,\n  and returns the string `false` if the path is inaccessible or points to a\n  broken symlink.\n- `read(path)`\u003Csup>1.39.0\u003C\u002Fsup> - Returns the content of file at `path` as a\n  string.\n\n#### Assertions and Error Reporting\n\n- `assert(CONDITION, EXPRESSION)`\u003Csup>1.27.0\u003C\u002Fsup> - Error with message\n  `EXPRESSION` if `CONDITION` is false.\n- `error(message)` - Abort execution and report error `message` to user.\n\n#### UUID and Hash Generation\n\n- `blake3(string)`\u003Csup>1.25.0\u003C\u002Fsup> - Return [BLAKE3] hash of `string` as hexadecimal string.\n- `blake3_file(path)`\u003Csup>1.25.0\u003C\u002Fsup> - Return [BLAKE3] hash of file at `path` as hexadecimal\n  string.\n- `sha256(string)` - Return the SHA-256 hash of `string` as hexadecimal string.\n- `sha256_file(path)` - Return SHA-256 hash of file at `path` as hexadecimal\n  string.\n- `uuid()` - Generate a random version 4 UUID.\n\n[BLAKE3]: https:\u002F\u002Fgithub.com\u002FBLAKE3-team\u002FBLAKE3\u002F\n\n#### Random\n\n- `choose(n, alphabet)`\u003Csup>1.27.0\u003C\u002Fsup> - Generate a string of `n` randomly\n  selected characters from `alphabet`, which may not contain repeated\n  characters. For example, `choose('64', HEX)` will generate a random\n  64-character lowercase hex string.\n\n#### Datetime\n\n- `datetime(format)`\u003Csup>1.30.0\u003C\u002Fsup> - Return local time with `format`.\n- `datetime_utc(format)`\u003Csup>1.30.0\u003C\u002Fsup> - Return UTC time with `format`.\n\nThe arguments to `datetime` and `datetime_utc` are `strftime`-style format\nstrings, see the\n[`chrono` library docs](https:\u002F\u002Fdocs.rs\u002Fchrono\u002Flatest\u002Fchrono\u002Fformat\u002Fstrftime\u002Findex.html)\nfor details.\n\n#### Semantic Versions\n\n- `semver_matches(version, requirement)`\u003Csup>1.16.0\u003C\u002Fsup> - Check whether a\n  [semantic `version`](https:\u002F\u002Fsemver.org), e.g., `\"0.1.0\"` matches a\n  `requirement`, e.g., `\">=0.1.0\"`, returning the string `\"true\"` if so and the\n  string `\"false\"` otherwise.\n\n#### Style\n\n- `style(name)`\u003Csup>1.37.0\u003C\u002Fsup> - Return a named terminal display attribute\n  escape sequence used by `just`. Unlike terminal display attribute escape\n  sequence constants, which contain standard colors and styles, `style(name)`\n  returns an escape sequence used by `just` itself, and can be used to make\n  recipe output match `just`'s own output.\n\n  Recognized values for `name` are `'command'`, for echoed recipe lines,\n  `error`, and `warning`.\n\n  For example, to style an error message:\n\n  ```just\n  scary:\n    @echo '{{ style(\"error\") }}OH NO{{ NORMAL }}'\n  ```\n\n##### User Directories\n\nThese functions\u003Csup>1.23.0\u003C\u002Fsup> return paths to user-specific directories for\nthings like configuration, data, caches, executables, and the user's home\ndirectory.\n\nOn Unix, these functions follow the\n[XDG Base Directory Specification](https:\u002F\u002Fspecifications.freedesktop.org\u002Fbasedir-spec\u002Fbasedir-spec-latest.html).\n\nOn macOS and Windows, these functions return the system-specified user-specific\ndirectories. For example, `cache_directory()` returns `~\u002FLibrary\u002FCaches` on\nmacOS and `{FOLDERID_LocalAppData}` on Windows.\n\nSee the [`dirs`](https:\u002F\u002Fdocs.rs\u002Fdirs\u002Flatest\u002Fdirs\u002Findex.html) crate for more\ndetails.\n\n- `cache_directory()` - The user-specific cache directory.\n- `config_directory()` - The user-specific configuration directory.\n- `config_local_directory()` - The local user-specific configuration directory.\n- `data_directory()` - The user-specific data directory.\n- `data_local_directory()` - The local user-specific data directory.\n- `executable_directory()` - The user-specific executable directory.\n- `home_directory()` - The user's home directory.\n- `runtime_directory()` - The user-specific runtime directory. Only defined on\n  Linux.\n\nIf you would like to use XDG base directories on all platforms you can use the\n`env(…)` function with the appropriate environment variable and fallback,\nalthough note that the XDG specification requires ignoring non-absolute paths,\nso for full compatibility with spec-compliant applications, you would need to\ndo:\n\n```just\nxdg_config_dir := if env('XDG_CONFIG_HOME', '') =~ '^\u002F' {\n  env('XDG_CONFIG_HOME')\n} else {\n  home_directory() \u002F '.config'\n}\n```\n\n### User-defined functions\n\nNew functions may be defined\u003Csup>1.49.0\u003C\u002Fsup>:\n\n```just\nset unstable\n\nhello(name) := f\"Hello, {{ name }}!\"\n\nfoo:\n  echo '{{ hello(\"World\") }}'\n```\n\nUser-defined functions are currently unstable.\n\nFunctions may reference assignments in the same module:\n\n```just\nset unstable\n\nbase := \"foo\"\n\njoin(extension) := base + \".\" + extension\n\ncreate:\n  touch {{ join(\"c\") }}\n  touch {{ join(\"html\") }}\n  touch {{ join(\"txt\") }}\n```\n\n### Constants\n\nA number of constants are predefined:\n\n| Name | Value | Value on Windows |\n|---|---|---|\n| `HEX`\u003Csup>1.27.0\u003C\u002Fsup> | `\"0123456789abcdef\"` |  |\n| `HEXLOWER`\u003Csup>1.27.0\u003C\u002Fsup> | `\"0123456789abcdef\"` |  |\n| `HEXUPPER`\u003Csup>1.27.0\u003C\u002Fsup> | `\"0123456789ABCDEF\"` |  |\n| `PATH_SEP`\u003Csup>1.41.0\u003C\u002Fsup> | `\"\u002F\"` | `\"\\\"` |\n| `PATH_VAR_SEP`\u003Csup>1.41.0\u003C\u002Fsup> | `\":\"` | `\";\"` |\n| `CLEAR`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\ec\"` |  |\n| `NORMAL`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[0m\"` |  |\n| `BOLD`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[1m\"` |  |\n| `ITALIC`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[3m\"` |  |\n| `UNDERLINE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[4m\"` |  |\n| `INVERT`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[7m\"` |  |\n| `HIDE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[8m\"` |  |\n| `STRIKETHROUGH`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[9m\"` |  |\n| `BLACK`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[30m\"` |  |\n| `RED`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[31m\"` |  |\n| `GREEN`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[32m\"` |  |\n| `YELLOW`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[33m\"` |  |\n| `BLUE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[34m\"` |  |\n| `MAGENTA`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[35m\"` |  |\n| `CYAN`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[36m\"` |  |\n| `WHITE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[37m\"` |  |\n| `BG_BLACK`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[40m\"` |  |\n| `BG_RED`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[41m\"` |  |\n| `BG_GREEN`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[42m\"` |  |\n| `BG_YELLOW`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[43m\"` |  |\n| `BG_BLUE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[44m\"` |  |\n| `BG_MAGENTA`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[45m\"` |  |\n| `BG_CYAN`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[46m\"` |  |\n| `BG_WHITE`\u003Csup>1.37.0\u003C\u002Fsup> | `\"\\e[47m\"` |  |\n\n```just\n@foo:\n  echo {{HEX}}\n```\n\n```console\n$ just foo\n0123456789abcdef\n```\n\nConstants starting with `\\e` are\n[ANSI escape sequences](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FANSI_escape_code).\n\n`CLEAR` clears the screen, similar to the `clear` command. The rest are of the\nform `\\e[Nm`, where `N` is an integer, and set terminal display attributes.\n\nTerminal display attribute escape sequences can be combined, for example text\nweight `BOLD`, text style `STRIKETHROUGH`, foreground color `CYAN`, and\nbackground color `BG_BLUE`. They should be followed by `NORMAL`, to reset the\nterminal back to normal.\n\nEscape sequences should be quoted, since `[` is treated as a special character\nby some shells.\n\n```just\n@foo:\n  echo '{{BOLD + STRIKETHROUGH + CYAN + BG_BLUE}}Hi!{{NORMAL}}'\n```\n\n### Attributes\n\nRecipes, `mod` statements, and aliases may be annotated with attributes that\nchange their behavior.\n\n| Name | Type | Description |\n|------|------|-------------|\n| `[arg(ARG, help=\"HELP\")]`\u003Csup>1.46.0\u003C\u002Fsup> | recipe | Print help string `HELP` for `ARG` in usage messages. |\n| `[arg(ARG, long=\"LONG\")]`\u003Csup>1.46.0\u003C\u002Fsup> | recipe | Require values of argument `ARG` to be passed as `--LONG` option. |\n| `[arg(ARG, pattern=\"PATTERN\")]`\u003Csup>1.45.0\u003C\u002Fsup> | recipe | Require values of argument `ARG` to match regular expression `PATTERN`. |\n| `[arg(ARG, short=\"S\")]`\u003Csup>1.46.0\u003C\u002Fsup> | recipe | Require values of argument `ARG` to be passed as short `-S` option. |\n| `[arg(ARG, value=\"VALUE\")]`\u003Csup>1.46.0\u003C\u002Fsup> | recipe | Makes option `ARG` a flag which does not take a value. |\n| `[confirm(PROMPT)]`\u003Csup>1.23.0\u003C\u002Fsup> | recipe | Require confirmation prior to executing recipe with a custom prompt. |\n| `[confirm]`\u003Csup>1.17.0\u003C\u002Fsup> | recipe | Require confir","`just` 是一个命令运行工具，用于保存和执行项目特定的命令。它使用类似于 `make` 的语法将命令存储在 `justfile` 文件中，并通过 `just RECIPE` 命令来运行。相比 `make`，`just` 具有诸多改进，如避免了 `make` 的复杂性和特殊性、支持多种操作系统、提供详细的错误信息、支持命令行参数、静态错误检查、加载 `.env` 文件等功能。此外，`just` 还支持命令补全脚本、多语言编写命令等特性。适用于需要简化命令管理和执行的开发场景，特别适合那些希望提高开发效率并减少配置复杂性的开发者。",2,"2026-06-11 02:46:32","top_all"]