Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash 4.4 prompt escape for number of jobs currently running

I stumbled across this post where user chepner proposed in his answer the usage of \j (as mentioned in the bash manual) to retrieve the current running count of background jobs. Basically it boils down to

num_jobs="\j"
echo ${num_jobs@P}

Can anyone enlighten me on what is going on here exactly? E.g.

  • why ${\j@P} is not working and
  • what @P is doing exactly?
like image 224
Alex. Avatar asked Oct 19 '25 08:10

Alex.


2 Answers

Like any parameter expansion, you have to supply the name of a parameter, not an arbitrary string. \j isn't the name of a parameter; it's the text you want to get from a parameter expansion.

After the parameter has been expanded, @P further subjects the result to prompt expansion, so that \j is replaced by the number of jobs.

$ num_jobs="\j"
$ echo "${num_jobs}"
\j
$ echo "${num_jobs@P}"
0
like image 122
chepner Avatar answered Oct 21 '25 21:10

chepner


The part before the @ is the name of the parameter you're trying to expand, it can't be a string you want to modify somehow. And @P is a parameter expansion introduced in Bash 4.4 (see manual):

${parameter@operator}

The expansion is either a transformation of the value of parameter or information about parameter itself, depending on the value of operator. Each operator is a single letter:

P

The expansion is a string that is the result of expanding the value of parameter as if it were a prompt string (see Controlling the Prompt).

like image 32
Benjamin W. Avatar answered Oct 21 '25 22:10

Benjamin W.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!