From: avih Date: Thu, 25 Jul 2024 13:28:13 GMT Subject: Re: [PATCH 6/8] git-prompt: add fallback for shells without $'...' Message-ID: <258254527.2690084.1721914093743@mail.yahoo.com> In-Reply-To: <1106076396.2672924.1721906849141@mail.yahoo.com> On Thursday, July 25, 2024 at 02:27:29 PM GMT+3, avih wrote: > > So mainly as a general solution, but also applicable to this patch, > below is my best generalized solution so far, so that scripts don't > have to reinvent the wheel with this "string strip dance" above, > but I'm not too happy with it, mainly due to the gotcha that single > quotes in the value break the world (escape the "eval"). Pardon the noise. To summarize the options to replace $'...' portably, like:     __git_SOH=$'\1' __git_STX=$'\2' __git_ESC=$'\33'     __git_LF=$'\n' __git_CRLF=$'\r\n' The current patch has this, which is not fun and not scalable:    __git_CRLF=$(printf "\r\n\1\2\33")  # CR LF SOH STX ESC    __git_ESC=${__git_CRLF#????}; __git_CRLF=${__git_CRLF%?}    __git_STX=${__git_CRLF#???};  __git_CRLF=${__git_CRLF%?}    __git_SOH=${__git_CRLF#??};   __git_CRLF=${__git_CRLF%?}    __git_LF=${__git_CRLF#?} If performance is not important, this works (with care about \n):    __git_LF=$(printf "\nx"); __git_LF=${__git_LF%x}    __git_STX=$(printf '\1')    ... A previous message suggested this, which has a beautiful API, but it requires an additional non-tiny function, and it also hides a great risk of escaping "eval":     assign_as_fmt () {         # hides the usage of "eval"         ...     }     assign_as_fmt \         __git_SOH='\1' __git_STX='\2' __git_ESC='\33' \         __git_LF='\n' __git_CRLF='\r\n' But then I figured there's another option, which is reasonably readable, scalable, small without additional functions, but still requires some care, though the risk is not hidden and easy to avoid: It's basically what the function does, but without a function: (double quotes required only if it ends in \n, or for uniformity)     # doubel-check to ensure the printf output is valid shell input     eval "$(printf '         __git_SOH="\1" __git_STX="\2" __git_ESC="\33"         __git_LF="\n" __git_CRLF="\r\n"     ')" I think it strikes the best balance between the options, both for this patch, and possibly also as a general recomendation. So unless there are objections or better suggestions, this is what I currently prefer for this patch.