Bash scans the command line and splits it into words, usually to put the parameters you enter for a command into the right C-memory (the ''​argv''​ vector) to later correctly call the command. These words are recognized by splitting the commandline ​at the position of special ​characters, **Space** or **Tab** (manual defines them as **blanks**).

+

Bash scans the command line and splits it into words, usually to put the parameters you enter for a command into the right C-memory (the ''​argv''​ vector) to later correctly call the command. These words are recognized by splitting the command line at the special ​character position, **Space** or **Tab** (the manual defines them as **blanks**).

-

For example, take the echo program. It displays all its parameters separated by a space on the terminal. When you enter an echo command ​on your Bash prompt, Bash will do what told above: It will look for those special characters, and use them to determinate what are separate parameters.

+

For example, take the echo program. It displays all its parameters separated by a space. When you enter an echo command ​at the Bash prompt, Bash will look for those special characters, and use them to separate ​the parameters.

You don't know what I'm talking about? I'm talking about this:

You don't know what I'm talking about? I'm talking about this:

Line 18:

Line 18:

</​code>​

</​code>​

-

In other words, something you do (and Bash does) everyday. The characters where Bash splits the command line (SPACE, TAB - blanks) are recognized as told above.

+

In other words, something you do (and Bash does) everyday. The characters where Bash splits the command line (SPACE, TAB i.e. blanks) are recognized as delimiters.

-

There is no null-argument generated when you have 2 or more blanks in the commandline. **A sequence of more blank characters is treated ​like one single blank character.**

+

There is no null argument generated when you have 2 or more blanks in the command line. **A sequence of more blank characters is treated ​as a single blank.**

-

Let'​s ​see what I mean:

+

Here'​s ​an example:

<​code>​

<​code>​

Line 27:

Line 27:

</​code>​

</​code>​

-

As promised: ​Bash splits the commandline ​at the position of a sequence of one or more blanks into words, then it calls echo with **each word being a separate parameter** to it. In this example, echo is called with exactly 3 parameters: "''​Hello''",​ "''​little''"​ and "''​world''"​!

+

Bash splits the command line at the blanks into words, then it calls echo with **each word as an argument**. In this example, echo is called with three arguments: "''​Hello''",​ "''​little''"​ and "''​world''"​!

-

__Does that mean we can't echo more than one Space now?__ Of course not!

+

__Does that mean we can't echo more than one Space?__ Of course not!

-

Bash treats ​the blanks special, but there is a way to tell Bash to not treat them special: **Escaping** and **quoting**.

+

Bash treats blanks ​as special ​characters, but there are two ways to tell Bash not to treat them special: **Escaping** and **quoting**.

-

Escaping a character means, to **take away the special ​role of a character**. Bash will literally ​use an escaped character as text, even if it's a special one. Escaping is done by preceeding the character with a backslash:

+

Escaping a character means, to **take away its special ​meaning**. Bash will use an escaped character as text, even if it's a special one. Escaping is done by preceeding the character with a backslash:

<​code>​

<​code>​

Line 39:

Line 39:

</​code>​

</​code>​

-

None of the above spaces will be used to split the commandline into words (one, infact, the space between echo and the rest - it's used to determinate what is the command and what should be its arguments). Thus, echo is called with exaclty ​one parameter: "''​Hello ​ little ​ world''"​.

+

None of the escaped ​spaces will be used to perform word splitting. Thus, echo is called with one argument: "''​Hello ​ little ​ world''"​.

-

And as we're all lazy and want an easy life, Bash has a mechanism to "//mass-escape//" ​a complete area of the commandline: **Quoting**.

+

Bash has a mechanism to "​escape" ​an entire string: **Quoting**.

-

In the context of commandline-splitting, which this section is about, it doesn'​t matter which kind of quoting you use: weak quoting or strong quoting, both mask the blanks we talked about to not be special:

+

In the context of command-splitting, which this section is about, it doesn'​t matter which kind of quoting you use: weak quoting or strong quoting, both cause Bash to not treat spaces as special ​characters:

<​code>​

<​code>​

Line 53:

Line 53:

</​code>​

</​code>​

-

__What is it all about now?__ Well, for example imagine a program that expects a filename as parameter, like cat. Filenames can have spaces in them:

+

__What is it all about now?__ Well, for example imagine a program that expects a filename as an argument, like cat. Filenames can have spaces in them:

<​code>​

<​code>​

Line 71:

Line 71:

</​code>​

</​code>​

-

Nothing special, as you usually ​enter that on the commandline ​with Tab-completition, that will take care of the spaces. But there'​s another splitting ​Bash does.

+

If you enter that on the command line with Tab completion, that will take care of the spaces. But Bash also does another type of splitting.

===== Word splitting =====

===== Word splitting =====

-

For a more technical ​view, please read the [[syntax:​expansion:​wordsplit | article about word splitting]]!

+

For a more technical ​description, please read the [[syntax:​expansion:​wordsplit | article about word splitting]]!

-

The first kind of splitting is done by Bash to parse the commandline ​into separate tokens. This is what was described above, it's a pure **commandline ​parsing**.

+

The first kind of splitting is done to parse the command line into separate tokens. This is what was described above, it's a pure **command line parsing**.

-

After the commandline ​has been split into words, Bash will perform ​expansions, if needed - variables that occur in the commandline ​need to be expanded (substituted by their value), for example. This is where the second type of word splitting comes in - several expansions ​finally ​undergo **word splitting** (but others do not).

+

After the command line has been split into words, Bash will perform ​expansion, if needed - variables that occur in the command line need to be expanded (substituted by their value), for example. This is where the second type of word splitting comes in - several expansions undergo **word splitting** (but others do not).

-

Imagine you have a filename stored in a variable ​(variables will be explained elsewhere, just believe what you see):

+

Imagine you have a filename stored in a variable:

<​code>​

<​code>​

Line 87:

Line 87:

</​code>​

</​code>​

-

When this variable is used, its occurance will be substituted ​by its content.

+

When this variable is used, its occurance will be replaced ​by its content.

<​code>​

<​code>​

Line 95:

Line 95:

</​code>​

</​code>​

-

Though this is another step where spaces make a hard life, the **quoting** is used again to influence it. Quotes also affect ​the word splitting:

+

Though this is another step where spaces make things difficult, **quoting** is used to work around the difficulty. Quotes also affect word splitting:

<​code>​

<​code>​

Line 120:

Line 120:

</​code>​

</​code>​

-

The parser will scan for blanks and mark the relevant words ("​splitting the commandline"):

+

The parser will scan for blanks and mark the relevant words ("​splitting the command line"):

-

^Initial ​commandline ​splitting:​^^^^^^

+

^Initial ​command line splitting:​^^^^^^

^Word 1^Word 2^Word 3^Word 4^Word 5^Word 6^

^Word 1^Word 2^Word 3^Word 4^Word 5^Word 6^

|''​echo''​|''​The''​|''​file''​|''​is''​|''​named''​|''​$MYFILE''​|

|''​echo''​|''​The''​|''​file''​|''​is''​|''​named''​|''​$MYFILE''​|

-

A [[syntax:pe | parameter-/variable expansion]] is part of that commandline, Bash will perform the substitution,​ and the [[syntax:​expansion:​wordsplit | word splitting]] on the results:

+

A [[syntax:pe | parameter/​variable expansion]] is part of that command line, Bash will perform the substitution,​ and the [[syntax:​expansion:​wordsplit | word splitting]] on the results: