expr is not an Linux builtin command,why expr $BASHPID show current shell pid

Issue

expr is not an Linux builtin command,why expr $BASHPID show current shell pid?

It’s so strange! I think it should output subshell pid.

$ type expr
expr is hashed (/usr/bin/expr)
$ echo $$
49207
$ expr $BASHPID
49207

Solution

This is normal and expected: Parameter expansion happens before command execution, so BASHPID tells you the PID of the instance of bash that’s determining which arguments to pass to expr, not the PID of expr itself. By the time a fork() takes place, these arguments are already determined.

If you want the PID of expr itself, you can use an explicit subshell to make the fork happen earlier, and then use exec to make expr inherit that subshell’s PID:

echo "Parent PID is $$ / $BASHPID"
(printf %s 'expr PID is '; exec expr "$BASHPID")

The ( creates an explicit subshell (instead of the implicit one created during the execution process), so BASHPID then provides its PID; exec causes expr to inherit that PID.

Answered By – Charles Duffy

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published