Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH提示符中的正确返回值_Bash_Prompt_Ps1 - Fatal编程技术网

BASH提示符中的正确返回值

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输

这是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输出设置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}]
。看见