Using Secondary Prompts: $PS2, $PS3, $PS4

Problem

You’d like to understand what the $PS2, PS3, and PS4 prompts do.

Solution

$PS2 is called the secondary prompt string and is used when you are interactively entering a command that you have not completed yet. It is usually set to “> " but you can redefine it. For example:

[jp@freebsd jobs:0]
/home/jp$ export PS2='Secondary: '

[jp@freebsd jobs:0]
/home/jp$ for i in $(ls)
Secondary: do
Secondary: echo $i
Secondary: done
colors
deepdir
trunc_PWD

$PS3 is the select prompt, and is used by the select statement to prompt the user for a value. It defaults to #?, which isn’t very intuitive. You should change it before using the select command; for example:

[jp@freebsd jobs:0]
/home/jp$ select i in $(ls)
Secondary: do
Secondary: echo $i
Secondary: done
1) colors
2) deepdir
3) trunc_PWD
#? 1
colors
#? ^C

[jp@freebsd jobs:0]
/home/jp$ export PS3='Choose a directory to echo: '

[jp@freebsd jobs:0]
/home/jp$ select i in $(ls); do echo $i; done
1) colors
2) deepdir
3) trunc_PWD
Choose a directory to echo: 2
deepdir
Choose a directory to echo: ^C

$PS4 is displayed during trace output. Its first character is shown as many times as necessary to denote the nesting depth. The default is “+ “. For example:

[jp@freebsd jobs:0]
/home/jp$ cat demo
#!/usr/bin/env bash

set -o xtrace

alice=girl
echo "$alice"

ls -l $(type -path vi)

echo line 10
ech0 line 11
echo line 12

[jp@freebsd jobs:0]
/home/jp$ ./demo
+ alice=girl
+ echo girl
girl
++ type -path vi
+ ls -l /usr/bin/vi
-r-xr-xr-x 6 root wheel 285108 May 8 2005 /usr/bin/vi
+ echo line 10
line 10
+ ech0 line 11
./demo: line 11: ech0: command not found
+ echo line 12
line 12

[jp@freebsd jobs:0]
/home/jp$ export PS4='+xtrace $LINENO: '
[jp@freebsd jobs:0]
/home/jp$ ./demo
+xtrace 5: alice=girl
+xtrace 6: echo girl
girl
++xtrace 8: type -path vi
+xtrace 8: ls -l /usr/bin/vi
-r-xr-xr-x 6 root wheel 285108 May 8 2005 /usr/bin/vi
+xtrace 10: echo line 10
line 10
+xtrace 11: ech0 line 11
./demo: line 11: ech0: command not found
+xtrace 12: echo line 12
line 12

Discussion

The $PS4 prompt uses the $LINENO variable, which when used in a function under versions of bash prior to 2.0 returns the number of simple commands executed, rather than the actual line number in the function. Also note the single quotes, which defer expansion of the variable until display time.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.224.63.87