变量 $?不适用于 mksh 上的 $PS1
The variable $? does not work on $PS1 on mksh
我希望我的提示显示最后一个命令的退出状态,所以我将 PS1 设置为:
PS1="$? > "
但它总是打印 0 >
。
例如,即使我 运行 false
,提示也不会打印 1 >
或任何退出状态。
为什么会出现这种情况?
编辑:
我尝试用一个函数来设置我的提示,测试退出状态是否大于0,所以它不会一直打印0 >
,只有当退出状态不为零时才会打印。
promptcmd() {
_EXIT=$?
test $_EXIT -gt 0 && printf "\e[1;31m [$_EXIT]"
printf "\e[0m ❯ "
unset _EXIT
}
PS1="$(promptcmd)"
但是还是不行。
$?
在您 定义 PS1
时展开,因为您使用了双引号。
您可以使用单引号延迟扩展,直到显示 PS1
:
PS1='$? > '
这种"double expansion"不是一般的属性参数,而是shell使用PS1
的值的结果。 echo "$PS1"
仍将显示文字字符串 $? >
,但当 shell 显示提示时,它会扩展在值中找到的任何参数扩展。
我希望我的提示显示最后一个命令的退出状态,所以我将 PS1 设置为:
PS1="$? > "
但它总是打印 0 >
。
例如,即使我 运行 false
,提示也不会打印 1 >
或任何退出状态。
为什么会出现这种情况?
编辑:
我尝试用一个函数来设置我的提示,测试退出状态是否大于0,所以它不会一直打印0 >
,只有当退出状态不为零时才会打印。
promptcmd() {
_EXIT=$?
test $_EXIT -gt 0 && printf "\e[1;31m [$_EXIT]"
printf "\e[0m ❯ "
unset _EXIT
}
PS1="$(promptcmd)"
但是还是不行。
$?
在您 定义 PS1
时展开,因为您使用了双引号。
您可以使用单引号延迟扩展,直到显示 PS1
:
PS1='$? > '
这种"double expansion"不是一般的属性参数,而是shell使用PS1
的值的结果。 echo "$PS1"
仍将显示文字字符串 $? >
,但当 shell 显示提示时,它会扩展在值中找到的任何参数扩展。