I'm new to working in the shell and the usage of these commands seems arbitrary. Is there a reason one flag has a single dash and another might have a double dash?
A single hyphen can be followed by multiple single-character flags. A double hyphen prefixes a single, multicharacter option.
Consider this example:
In this example,
-czf specifies three single-character flags:
Now consider another example:
In this case,
--exclude specifies a single, multicharacter option named
exclude. The double hyphen disambiguates the command-line argument, ensuring that
tar interprets it as
exclude rather than a combination of
It all depends on the program. Usually "-" is used for 'short' options (one-letter, -h), and "--" is used for "long"(er) options (--help).
Short options can usually be combined (so "-h -a" is same as "-ha")
In Unix-like systems, the ASCII hyphen–minus is commonly used to specify options. The character is usually followed by one or more letters. An argument that is a single hyphen–minus by itself without any letters usually specifies that a program should handle data coming from the standard input or send data to the standard output. Two hyphen–minus characters ( -- ) are used on some programs to specify "long options" where more descriptive option names are used. This is a common feature of GNU software.
It's really a convention. However, it can aid parsers to know more efficiently about options passed to the program.
Besides, there are neat utilities that can help parsing these commands, such as
getopt(3) or the non-standard
getopt_long(3) to help parse the arguments of a program.
It is nice, for we can have multiple short options combined, as other answers say, like
tar -xzf myfile.tar.gz.
If there was a "lisa" argument for
ls, there would probably have a different meaning to type
ls -lisa than
ls --lisa. The former are the
a parameters, not the word.
In fact, you could write
ls -l -i -s -a, meaning exactly the same as
ls -lisa, but that would depend on the program.
There are also programs that don't obey this convention. Most notably for my sight,
short options with single dash vs long options with double dash
short options can be combined into a single argument;
for example: ls -lrt #instead of ls -l -r -t
If we allow long options with single dash, it causes ambiguity. To resolve this we use double dash for long options.