On 16 Okt., 21:18, Chet Ramey <chet.ra...@case.edu> wrote: > Sort of. I think you're overlooking the various expansion (and backslash > escaping) that's taking place with your prompt. > > Since you set the value of PS1 to literal string containing a command > substitution, the value will be expanded twice before being sent to > readline. The first expansion is the normal set of backslash escapes > performed by prompt string decoding; the second is the set of shell word > expansions, including command substitution. > > This is the problem line: printf "\033_%s\033\\" "${termtitle}". I > assume the intent is to wind up with a string ending with a single > backslash written to the terminal. The string as written results in > a parsing error. > > One of the prompt string decoding expansions turns \\ into \, so the > form of the above string when passed to the parser by the command > substitution is > > printf "ESC_%sESC\" "${termtitle}" > > (the ESC stands for a literal escape character). The escaped double quote > is probably not what's intended. > > For printf to see what you want it to, you need to double the backslashes > in that string: > > printf "\033_%s\033\\\\" "${termtitle}" > > Try that and see what you get.
Yes, that was the problem, I did not take into account that bash expands $PS1 twice. This is easy to reproduce by setting PS1='$ ( printf "\\" )' which works with ash, ksh93, ksh88 but fails with bash which needs PS1='$( printf "\\\\" )'. Is this double expansion even POSIX compliant? The spec says that "[e]ach time an interactive shell is ready to read a command, the value of this variable shall be subjected to parameter expansion..." (http://www.opengroup.org/ onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_03)