在其他变量中使用Bash脚本命令结果来定义提示

时间:2012-12-14 10:04:36

标签: bash shell

我想定义一个提示,它会用颜色指示命令是否正确执行以及命令是否已找到。至于现在我有类似的东西,但我没有正常工作。

PS1="\`COMMAND_RESULT=\$\?;

if [ $COMMAND_RESULT -eq 127 ]; then echo \[\e[33m\] ---=== Command not found ===--- ;  

elif [ $COMMAND_RESULT -ne 0 ]; then echo \[\e[33m\]---=== \[\e[31m\]Oh noes, bad command \[\e[33m\]==---; 

fi\`

\n\[\e[0;37m\][\[\e[1;31m\]\@\[\e[0;37m\]] 

\[\e[0;32m\]\u\[\033[1;33m\]@\[\033[0;32m\]\h 

至于现在,我在bash start上遇到了这个错误:

-bash: [: -eq: unary operator expected
-bash: [: -ne: unary operator expected

2 个答案:

答案 0 :(得分:1)

不要用功能污染PS1。您应该使用特殊的PROMPT_COMMAND变量来执行此操作。 PROMPT_COMMAND的值在发出每个主要提示之前作为命令执行。

以下是一个例子:

_check_command(){
   local COMMAND_RESULT=$?
   if [ $COMMAND_RESULT -eq 127 ]
   then
       echo -e "\e[1;33m---=== Command not found ===---\e[m"
   elif [ $COMMAND_RESULT -ne 0 ]
   then
       echo -e "\e[1;31m---=== Oh noes, bad command ===---\e[m"
   fi
}
PROMPT_COMMAND='_check_command'
PS1="\[\e[0;37m\][\[\e[1;31m\]\@\[\e[0;37m\]] \[\e[0;32m\]\u\[\033[1;33m\]@\[\033[0;32m\]\h " 

您可以在线找到许多bash提示来指导您。 Here就是一个很好的例子。

答案 1 :(得分:0)

你可能不应该$?作为\$\?。看起来它按字面解释。

另外,您可以查看Arch Wiki文章,了解如何实现类似于您想要的内容。看看这一行:

PS1="$(if [[ ${EUID} == 0 ]]; then echo '\[\033[01;31m\]\h'; else echo '\[\033[01;32m\]\u@\h'; fi)\[\033[01;34m\] \w \$([[ \$? != 0 ]] && echo \"\[\033[01;31m\]:(\[\033[01;34m\] \")\$\[\033[00m\] "

特别是这部分:

([[ \$? != 0 ]] && echo \"\[\033[01;31m\]:(\[\033[01;34m\] \")