When I use these shell commands:

[root@linux /tmp]# a=$$
[root@linux /tmp]# echo $a

where does the value 3985 come from? And why?

  • Notice that using $$ for generating temp file names have poor security implications. – hlovdal Aug 15 '11 at 9:00
man bash

explains it.

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 $$
host@controller:~$ ps -p 12481
  PID TTY          TIME CMD
12481 pts/2    00:00:01 bash

Since we execute echo $$ in bash, we get it's current pid

know also

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

As mentioned above, the $$ in the filename will be the PID of the main script.


Try "echo $$" you will get the answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.