I have executed the following command sequence:
$ now=$(date)
$ echo _$now_
_
$ echo _ $now _
_ Mon Sep 22 09:53:44 IST 2014 _
Why is the output of _$now_
only _
?
From man bash
:
DEFINITIONS
The following definitions are used throughout the rest of this document.
blank A space or tab.
word A sequence of characters considered as a single unit by the shell.
Also known as a token.
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
...
PARAMETERS
A parameter is an entity that stores values. It can be a name, a number,
or one of the special characters listed below under Special Parameters.
A variable is a parameter denoted by a name.
A variable can only have alphabets, numbers and underscores. And so now_
is a valid variable name, and is interpreted as such.
You can delimit the variable name in different ways:
_"$now"_
_${now}_
_$now"_"
_$now'_'
Or any combination of the above.
because _
is part of the variable name in your echo _$now_
use echo \_$now\_
instead.
Also you can use that just in a linear command: echo _$(date)_
echo _${now}_
Sep 22, 2014 at 12:27
Bear with me for a moment, this requires a bit of explaining.
First of, why is output of _ $(date) _
is _ Mon Sep 22 03:30:34 MDT 2014 _
? Because this literally tells echo to output _ first then output $(date) then _ . Spaces separate the variables for echo.
Now try echo _$(date)
, note no space between _
and $(date)
. In this case output will be _Mon Sep 22 03:32:40 MDT 2014
. What does this do? you tell echo
to concatenate underscore with output of $(date)
.
Try same thing with _$PWD
, which will concatenate your working directory with underscore. Now try echo $PWD_
. The output will be blank. Why? because PWD_
is non-existent environment variable, and as others have mentioned _
is valid character for an environment variable, e.g. $XDG_CURRENT_DESKTOP
.
So why _$PWD_
would give _
? Because you are telling echo
to concatenate _
with output of non-existent environment variable. So _
is printed, but $PWD_
output is blank, so you literally see _
concatenated with that blank output.
_$now_
is interpreted as
_${now_}
which is, in your case, obviously the string concat of '_' and ''. Use therefore
_${now}_
instead. It is much more clear to read.