The double-dash delimiter (aka option terminator) allows you to pass arbitrary commands to a CLI program. The arguments passed after the --
are treated as arguments and not flag of a program even if it begins with a hyphen.
For example, if you would like to delete a folder called -r
, the rm -r
command would be invalid because -r
is an option for the rm
command. Therefore, to successfully delete the folder you can separate the command and option with the double-dash like so:
rm -- -r
In this case, it separates/ terminates/ delimits rm
’s options from its values.
Options passed after the --
can be provided multiple times and in any order.
User defined arguments
Disclaimer: The following example is specific to JavaScript/ Node.js but could also apply to other languages/ runtimes.
Prisma 4.15.0 ↗ added support for custom arguments for the prisma db seed
↗ command, which led me to the interesting discovery of what a double-dash/ option terminator is, and it’s possibilities.
If you’re building a CLI program you could use the double-dash delimiter to allow users to “extend” your program and pass their own arguments, separated by --
.
For example, with the prisma db seed
command, you could define your own arguments to to partially seed data in specific tables by passing a --tables
option as follows:
npx prisma db seed -- --tables=user,post
… and within the seed file, you could parse the --tables
option’s values as follows:
import { parseArgs } from 'node:util'
const options = {
tables: { type: "string" },
}
async function main() {
const { values: { tables }, } = parseArgs({ options })
tables.split(",").forEach(table => {
/** logic to seed tables defined here */
});
}
main()
Other libraries such as vitest ↗ and eslint ↗, among many others, also provide the double-dash.
This is only one of many examples you could use custom arguments. Feel free to explore the different use-cases you think of and share them with us. I would be particularly interested in what you build. 🙂
Going further
If you’re interested in reading further, I would recommend the following: