I'm a bash scripting beginner, and I have a "homework" to do. I figured most of the stuff out but there is a part which says that I have to echo the pid of the parent bash and the pid of the two subshells that I will be running. So I looked online and found this (The Linux documentation project):
#!/bin/bash4 echo "\$\$ outside of subshell = $$" # 9602 echo "\$BASH_SUBSHELL outside of subshell = $BASH_SUBSHELL" # 0 echo "\$BASHPID outside of subshell = $BASHPID" # 9602 echo ( echo "\$\$ inside of subshell = $$" # 9602 echo "\$BASH_SUBSHELL inside of subshell = $BASH_SUBSHELL" # 1 echo "\$BASHPID inside of subshell = $BASHPID" ) # 9603 # Note that $$ returns PID of parent process.
So here are my questions:
1) What does the first echo print? Is this the pid of the parent bash?
2) Why does the 2nd echo print out 0?
3) Is $BASH_SUBSHELL a command or a variable?
4) I'm doing everything on a mac, I will try all of this on a Linux machine in some days but whenever I run this script $BASHPID
doesn't return anything, I just get a new line. Is this because I'm running this on a mac and $BASHPID
doesn't work on a mac?
Symbol: $$ The symbol $$ stores the PID of the current shell. For example: #! /bin/bash. echo $$ In my case, it printed out the value 2443.
$$ is the pid (process id) of the shell interpreter running your script. It's different for each process running on a system at the moment, but over time the pid wraps around, and after you exit there will be another process with same pid eventually.As long as you're running, the pid is unique to you.
The echo command is used to display a line of text that is passed in as an argument. This is a bash command that is mostly used in shell scripts to output status to the screen or to a file.
$$ is the process id of the currently running process in UNIX. mostly it is used with naming of logfiles aor temp files, such that there is no conflict of file names while multiple instances of the same scripts are running.
Looking at documentation on this, it looks like:
$$
means the process ID that the script file is running under. For any given script, when it is run, it will have only one "main" process ID. Regardless of how many subshells you invoke, $$
will always return the first process ID associated with the script. BASHPID
will show you the process ID of the current instance of bash, so in a subshell it will be different than the "top level" bash which may have invoked it.BASH_SUBSHELL
indicates the "subshell level" you're in. If you're not in any subshell level, your level is zero. If you start a subshell within your main program, that subshell level is 1. If you start a subshell within that subshell, the level would be 2, and so on.BASH_SUBSHELL
is a variable.BASHPID
isn't supported by the version of bash you have? I doubt it's a "Mac" problem.It'd be best to get well-acquainted with bash(1)
:
BASHPID Expands to the process ID of the current bash process. This differs from $$ under certain circumstances, such as subshells that do not require bash to be re- initialized. [...] BASH_SUBSHELL Incremented by one each time a subshell or subshell environment is spawned. The initial value is 0.
$BASHPID
was introduced with bash-4.0-alpha. If you run bash --version
you can find out what version of bash(1)
you're using.
If you're going to be doing much bash(1)
work, you'll also need the following:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With