diff --git a/profile.d/80-systemd-osc-context.sh b/profile.d/80-systemd-osc-context.sh index ea8f456caf..80c4740d47 100644 --- a/profile.d/80-systemd-osc-context.sh +++ b/profile.d/80-systemd-osc-context.sh @@ -35,20 +35,27 @@ shopt -q promptvars || return 0 __systemd_osc_context_escape() { - # Escape according to the OSC 3008 spec. Since this requires shelling out - # to 'sed' we'll only do it where it's strictly necessary, and skip it when - # processing strings we are pretty sure we won't need it for, such as - # uuids, id128, hostnames, usernames, since they all come with syntax - # requirements that exclude \ and ; anyway. This hence primarily is about - # escaping the current working directory. - echo "$1" | sed -e 's/\\/\\x5c/g' -e 's/;/\\x3b/g' -e 's/[[:cntrl:]]/⍰/g' + # Escape according to the OSC 3008 spec. We'll skip it when processing + # strings we are pretty sure we won't need it for, such as uuids + # (originating from /proc/sys/kernel/ or /etc/machine-id) and special shell + # variables such as $$ and $? that always expand to decimal numbers. + local systemd_format="$1" + local systemd_value="$2" + systemd_value="${systemd_value//\\/\\x5c}" + systemd_value="${systemd_value//;/\\x3b}" + systemd_value="${systemd_value//[[:cntrl:]]/⍰}" + # shellcheck disable=SC2059 # always called with fixed format strings with a single string specifier + printf "$systemd_format" "$systemd_value" } __systemd_osc_context_common() { if [ -f /etc/machine-id ]; then printf ";machineid=%.36s" "$(&-); then printf "\033]3008;end=%.64s;exit=failure;status=%d;signal=SIG%s\033\\" "$systemd_osc_context_cmd_id" "$systemd_exitstatus" "$systemd_signal" elif [ "$systemd_exitstatus" -ne 0 ]; then - printf "\033]3008;end=%.64s;exit=failure;status=%d\033\\" "$systemd_osc_context_cmd_id" $((systemd_exitstatus)) + printf "\033]3008;end=%.64s;exit=failure;status=%d\033\\" "$systemd_osc_context_cmd_id" "$systemd_exitstatus" else printf "\033]3008;end=%.64s;exit=success\033\\" "$systemd_osc_context_cmd_id" fi @@ -71,7 +78,7 @@ __systemd_osc_context_precmdline() { fi # Create or update the shell session - printf "\033]3008;start=%.64s%s;type=shell;cwd=%.255s\033\\" "$systemd_osc_context_shell_id" "$(__systemd_osc_context_common)" "$(__systemd_osc_context_escape "$PWD")" + printf "\033]3008;start=%.64s;type=shell%s\033\\" "$systemd_osc_context_shell_id" "$(__systemd_osc_context_common)" # Prepare cmd id for next command read -r systemd_osc_context_cmd_id