The Curious Case of Double Dashes
Bare -- in bash commands
Why do we sometimes use bare double dashes in commands like git checkout -- file.txt
? Isn’t git checkout file.txt
just as good?
Bare double dashes signify the end of options. Anything after --
is a parameter. For example in git, you can checkout a file named main
:
git checkout main # Checkout the main branch
git checkout -- main # Checkout the file named main
In proper documentation, we see git checkout -- file.txt
when git checkout file.txt
would work, too. -- safeguards against checking out branches when files have the same name as branches.
POSIX.1–2017 standard
12.2 Utility Syntax Guidelines Guideline 10: The first
--
argument that is not an option-argument should be accepted as a delimiter indicating the end of options. Any following arguments should be treated as operands, even if they begin with the ‘-’ character.
Use case: rm
When you need to delete an oddly named filed like -file.txt
, rm
treats -f
as an option. Use bare double dashes to delete the file. This works for many bash commands that work with files like cat
, mv
, or touch
.
rm -file.txt # rm: illegal option -- l
rm -- -file.txt
Use case: grep
You can use double dashes in grep when the search term starts with a dash:
grep -- -v *
This searches for the string ‘-v’ rather than interpreting it as the option for inverse matches.
Use case: npm scripts
Double dashes are incredibly useful for npm
scripts. Anything after the double dashes is not an option of npm
, but a parameter for the script that npm
executes.
TIL, you can pass parameters with -- to an npm script, like `npm run lint -- --fix` 🤯 pic.twitter.com/LVusMurAIX
— Franziska Hinkelmann, Ph.D. (@fhinkel) November 3, 2018
If we want to fix linter errors, we do not need to look up which linter is specified in package.json
. As long as the linter understands --fix
, we simply run
npm run lint -- --fix
I hope this shed some light on why we sometimes have bare double dashes in our commands. Where do you use --
? I would love to hear your tips in the comment section.