When I use these shell commands:
[root@linux /tmp]# a=$$ [root@linux /tmp]# echo $a 3985
where does the value 3985 come from? And why?
Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the current shell, not the subshell.
$$ is the pid of the current process
host@controller:~$ echo $$ 12481 host@controller:~$ ps -p 12481 PID TTY TIME CMD 12481 pts/2 00:00:01 bash host@controller:~$
Since we execute
echo $$ in bash, we get it's current pid
echo $? is the return code of the last executed command.
$# is the number of arguments
$* is the list of arguments passed to the current process
$[1 or 2 or ... n] value of each corresponding argument
That's why some people use it to construct a filename that's only used temporarily and then destroyed, as in this script fragment.
SCRATCHFILE=/tmp/emphemeral.$$ ; # Now have the script write to and read from the temp file rm $SCRATCHFILE ;
As mentioned above, the $$ in the filename will be the PID of the main script.
Try "echo $$" you will get the answer.