BASH提示符中的正确返回值
这是Ubuntu 19.10机器上设置提示的BASH提示符中的正确返回值,bash,prompt,ps1,Bash,Prompt,Ps1,这是Ubuntu 19.10机器上设置提示的.bashrc文件的一部分: #gnome终端或Guake中的终端选项卡名称 提示符\u COMMAND='echo-ne'\033]0;$(basename${PWD})\007'' GIT_PS1_showcolorHits=是 RET=\$? source/usr/lib/git-core/git-sh提示符 如果[“$color_prompt”=是];然后 颜色重置=$(tput sgr0) 颜色\u粗体=$(t输出粗体) 颜色\白色=$(t输
.bashrc
文件的一部分:
#gnome终端或Guake中的终端选项卡名称
提示符\u COMMAND='echo-ne'\033]0;$(basename${PWD})\007''
GIT_PS1_showcolorHits=是
RET=\$?
source/usr/lib/git-core/git-sh提示符
如果[“$color_prompt”=是];然后
颜色重置=$(tput sgr0)
颜色\u粗体=$(t输出粗体)
颜色\白色=$(t输出设置7)
颜色作业=$(tput setaf 7)
颜色\用户=$(tput setaf 3)
color_dir=$(tput setaf 4)
颜色\u加载=$(tput setaf 5)
color_SUCCESS=$(t输出setaf 2)
color_fail=$(输出设置为1)
sep=$(tput setaf 7)\)
PS1=“${color\u user}\u${sep}\[\D{%T}\]${sep}${color\u reset}\$({uu git\u PS1)${color\u dir}\W${color\u reset}${sep}\\`如果[${RET}==0]],则回显${color\u成功}0\;否则回显{color\u失败}{RET
其他的
PS1=“\u${sep}\[\D{%T}\]${sep}\$(\uu git\u PS1)\W${sep}\`如果[[${RET}==0]],则回显“0”;否则回显“${RET}”“fi\${sep}\$”
fi
这是一个正在使用的命令行示例:
snim2)10:39:53)dirname)0)$cd scratch
snim2)10:39:54)scratch)0)$git init
在…/scratch/.Git中初始化空Git存储库/
snim2)10:39:56)(主)刮伤)0)$asdasda
asdasda:未找到命令
snim2)10:40:05(主)刮伤)1)$$?
127:未找到命令
snim2)10:40:10)(主)刮)1)美元
如您所见,当命令的返回代码为非零时,它在提示符中显示为
1)
,而不是显示正确的返回代码——在本例中为127)
。如何修复此问题?我看不到您在哪里更新RET
的值。对动态零件使用PROMPT_命令
:
$ PS1='[\$?=$RET]$ '; PROMPT_COMMAND='RET=$?; if [ "$RET" -eq 0 ]; then RET="good $RET"; else RET="bad $RET"; fi'
[$?=good 0]$ echo okay
okay
[$?=good 0]$ lkjjlk
-bash: lkjjlk: command not found
[$?=bad 127]$ echo $?
127
[$?=good 0]$ ls lkjjl
ls: cannot access 'lkjjl': No such file or directory
[$?=bad 2]$ ls lkjjl; echo $?
ls: cannot access 'lkjjl': No such file or directory
2
[$?=good 0]$
我看不到您在哪里更新
RET
的值。对动态零件使用PROMPT_命令
:
$ PS1='[\$?=$RET]$ '; PROMPT_COMMAND='RET=$?; if [ "$RET" -eq 0 ]; then RET="good $RET"; else RET="bad $RET"; fi'
[$?=good 0]$ echo okay
okay
[$?=good 0]$ lkjjlk
-bash: lkjjlk: command not found
[$?=bad 127]$ echo $?
127
[$?=good 0]$ ls lkjjl
ls: cannot access 'lkjjl': No such file or directory
[$?=bad 2]$ ls lkjjl; echo $?
ls: cannot access 'lkjjl': No such file or directory
2
[$?=good 0]$
你可以:
..$(__git_ps1)...\`if [[ $? == 0 ]];
$?
将是\uuuu git\u ps1
的返回状态,而不是命令行上最后执行的命令
请立即尝试在第一个命令替换块中保存退出返回值:
if [ "$color_prompt" = yes ]; then
color_reset=$(tput sgr0)
color_bold=$(tput bold)
color_white=$(tput setaf 7)
color_jobs=$(tput setaf 7)
color_user=$(tput setaf 3)
color_dir=$(tput setaf 4)
color_load=$(tput setaf 5)
color_succeed=$(tput setaf 2)
color_fail=$(tput setaf 1)
sep=$(tput setaf 7)\)
else
color_reset=
color_bold=
color_white=
color_jobs=
color_user=
color_dir=
color_load=
color_succeed=
color_fail=
sep=\) # remove the braces...
fi
# note the quotes - "" expand at setting time, '' expand at runtime
PS1=
PS1+="${color_user}\u${sep}\[\D{%T}\]${sep}${color_reset}"
PS1+='$('
PS1+='ret=$?; ' # first thing we do - save the exit return value
PS1+='__git_ps1; '
PS1+='printf "%s" "'
PS1+="${color_dir}\W${color_reset}${sep}"
PS1+='"; '
PS1+='if ((ret == 0)); then '
PS1+='printf "%s" "'
PS1+="${color_succeed}" # expand variable on assignment side
PS1+='0"; ' # this looks strange. Just print first the color, then $ret...
PS1+='else '
PS1+='printf "%s" "'
PS1+="$color_fail"
PS1+='$ret"; '
PS1+='fi '
PS1+=')'
PS1+="${color_white}${sep}${color_reset}"
PS1+='\$ ' # note - this is *not* "\$ "
你可以:
..$(__git_ps1)...\`if [[ $? == 0 ]];
$?
将是\uuuu git\u ps1
的返回状态,而不是命令行上最后执行的命令
请立即尝试在第一个命令替换块中保存退出返回值:
if [ "$color_prompt" = yes ]; then
color_reset=$(tput sgr0)
color_bold=$(tput bold)
color_white=$(tput setaf 7)
color_jobs=$(tput setaf 7)
color_user=$(tput setaf 3)
color_dir=$(tput setaf 4)
color_load=$(tput setaf 5)
color_succeed=$(tput setaf 2)
color_fail=$(tput setaf 1)
sep=$(tput setaf 7)\)
else
color_reset=
color_bold=
color_white=
color_jobs=
color_user=
color_dir=
color_load=
color_succeed=
color_fail=
sep=\) # remove the braces...
fi
# note the quotes - "" expand at setting time, '' expand at runtime
PS1=
PS1+="${color_user}\u${sep}\[\D{%T}\]${sep}${color_reset}"
PS1+='$('
PS1+='ret=$?; ' # first thing we do - save the exit return value
PS1+='__git_ps1; '
PS1+='printf "%s" "'
PS1+="${color_dir}\W${color_reset}${sep}"
PS1+='"; '
PS1+='if ((ret == 0)); then '
PS1+='printf "%s" "'
PS1+="${color_succeed}" # expand variable on assignment side
PS1+='0"; ' # this looks strange. Just print first the color, then $ret...
PS1+='else '
PS1+='printf "%s" "'
PS1+="$color_fail"
PS1+='$ret"; '
PS1+='fi '
PS1+=')'
PS1+="${color_white}${sep}${color_reset}"
PS1+='\$ ' # note - this is *not* "\$ "
不应该是
RET=\$?
只是RET=$?
?无需逃避$
即可获得好的分数。但是,将该行更改为RET='$?'
不会给出不同的结果,如果没有这些单引号,则提示始终显示最后一个命令成功。单引号不会展开变量,因此RET
实际上是'$?'
RET=$?
应该可以!(不带引号)最后一个命令是$(\uu git\u ps1)
。请不要使用反勾号“”。改用$(…)
。奇怪的大括号用法-用单引号写就行了<代码>PS1=“\u${sep}-sep
在这里是未设置的。我想知道\)
在sep=…\)
中的是否是一个打字错误。sep
设置在PS1…
上面的行上,对吗?我已经做了你们两人建议的更改,但这并不能解决问题。RET=$?
仍然显示每个命令都成功了…不应该RET=\$?
只是de>RET=$?
?无需转义$
以获得好的结果。但是将该行更改为RET='$?'
不会给出不同的结果,如果没有这些单引号,提示始终显示最后一个命令成功。单引号不会展开变量,因此RET
实际上是'$?'
RET=$?
应该可以!(不带引号)$(\uu git\u ps1)
是最后一个命令。请不要使用反勾号。使用$(…)
代替。奇怪的大括号用法-只需用单引号将其写入。ps1=“\u${sep}
-sep
在此处取消设置。我想知道sep=…\)
中的\)
是否为打字错误。sep
设置在PS1…
上方的行上,对吗?我已经做了你们建议的改变,但这并不能解决问题RET=$?
仍然显示每一个成功的命令…这很有意义,而且您对代码的分解比我的好得多!非常感谢!另外:您应该将所有无法打印的字符括在\[
\]
中。否则,Home End键将无法正确检测线路的结束/开始。所有颜色的\[${color\u white}\]
等(可能在分配时)。并将\[\D{%T}\]
更改为[\D{%T}]
。你看,这很有道理,而且你对代码的理解比我好得多!非常感谢!另外:您应该将所有无法打印的字符括在\[
\]
中。否则,Home End键将无法正确检测线路的结束/开始。所有颜色的\[${color\u white}\]
等(可能在分配时)。并将\[\D{%T}\]
更改为[\D{%T}]
。看见