$ BASHPID und $$ unterscheiden sich in einigen Fällen

10

Ich lese "BASH Pocket Guide von Oreilly". Es sagte:

Die Prozess-ID des aktuellen Bash-Prozesses. In einigen Fällen kann dies von $$ abweichen.

Oben Erklärung, erklärte $BASHPIDVariable.

Frage: Welche Fälle?

Persischer Golf
quelle
1
Es sollte beachtet werden, dass $BASHPIDBASH 4 neu ist. Wenn Sie BASH 3.x verwenden, müssen Sie$$
Bruno Bronosky

Antworten:

19

Ein Beispiel finden Sie in der BASHPIDBeschreibung der Bash-Manpage:

   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.

Hier ist ein Beispiel für eine Unterschale, die den Inhalt der Variablen zusammen mit $$und den Inhalt BASHPIDaußerhalb der Unterschale ausgibt.

$ echo $(echo $BASHPID $$)      $$       $BASHPID
              25680    16920    16920    16920
#             |        |        |        |
#             |        |        |        -- $BASHPID outside of the subshell
#             |        |        -- $$ outside of the subshell
#             |        -- $$ inside of the subshell
#             -- $BASHPID inside of the subshell
Jordanm
quelle
14

Unterschalen. $$wird von POSIX angegeben und bleibt immer der Wert des ursprünglichen Shell-Prozesses. $BASHPIDist eine Bash-spezifische Variable und ist immer der Wert des Prozesses, von dem die Variable dereferenziert wird, wobei Unterschalen gezählt werden.

 $ f() { printf '%s: %d, %d\n' "$1" $$ $BASHPID; };
 $ ${BASH_VERSION+shopt -s lastpipe}; set +m;
 $ f 1 >&2 | f 2
2: 31490, 31490
1: 31490, 32545

Ich habe es geschafft, den mksh-Betreuer davon zu überzeugen BASHPID, die neueste Version hinzuzufügen , so dass es etwas portabel ist. Es ist auch möglich, BASHPIDksh93 selbst auf vielen Plattformen zu implementieren .

Ormaaj
quelle