Loading...

How to print current bash prompt?

Answer #1 100 %

Bash 4.4+ solution using parameter transformation for a prompt string: echo "${[email protected]}"

[[email protected] ~]$ echo "the prompt is '${[email protected]}'"
the prompt is '[[email protected] ~]$'
[[email protected] ~]$ TEST_STRING='\u is dining at \t using \s \V'
[[email protected] ~]$ echo "${TEST_STRING}"
\u is dining at \t using \s \V
[[email protected] ~]$ echo "${[email protected]}"
adamhotep is dining at 21:45:10 using bash 5.0.3
[[email protected] ~]$ 

From the Bash Reference Manual page on Shell Parameter Expansion:

${[email protected]}

Parameter transformation. 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:

Q  The expansion is a string that is the value of parameter quoted in a
   format that can be reused as input.
E  The expansion is a string that is the value of parameter with backslash
   escape sequences expanded as with the $'?' quoting mechanism.
P  The expansion is a string that is the result of expanding the value of
   parameter as if it were a prompt string (see PROMPTING below).
A  The expansion is a string in the form of an assignment statement or
   declare command that, if evaluated, will recreate parameter with its
   attributes and value.
a  The expansion is a string consisting of flag values representing
   parameter's attributes.

If parameter is @ or *, the operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the operation is applied to each member of the array in turn, and the expansion is the resultant list.

(See also this answer from duplicate question Echo expanded PS1.)

 

Z Shell (zsh) can do this with ${(%%)PS1} or with its print builtin's -P flag:

[[email protected] ~]% echo "the prompt is '${(%%)PS1}'"
the prompt is '[[email protected] ~]%'
[[email protected] ~]% print -P "the prompt is '$PS1'"
the prompt is '[[email protected] ~]%'
[[email protected] ~]% TEST_STRING="%n is dining at %* using %N $ZSH_VERSION"
[[email protected] ~]% echo "$TEST_STRING"
%n is dining at %* using %N 5.7.1
[[email protected] ~]% echo "${(%%)TEST_STRING}"
adamhotep is dining at 11:49:01 using zsh 5.7.1
[[email protected] ~]% print -P "$TEST_STRING"
adamhotep is dining at 11:49:07 using zsh 5.7.1
[[email protected] ~]% 

The Zsh Expansion and Subsitution manual tells us:

Parameter Expansion Flags. If the opening brace is directly followed by an opening parenthesis, the string up to the matching closing parenthesis will be taken as a list of flags. In cases where repeating a flag is meaningful, the repetitions need not be consecutive; for example, (q%q%q) means the same thing as the more readable (%%qqq). The following flags are supported:
?

%    Expand all % escapes in the resulting words in the same way as in prompts (see Prompt Expansion). If this flag is given twice, full prompt expansion is done on the resulting words, depending on the setting of the PROMPT_PERCENT, PROMPT_SUBST and PROMPT_BANG options.

From the Zsh Builtins documentation for print:

-P    Perform prompt expansion (see Prompt Expansion). In combination with -f, prompt escape sequences are parsed only within interpolated arguments, not within the format string.



You’ll also like:


© 2023 CodeForDev.com -