如何在 PS1 变量中插入 bash 脚本

如何在 PS1 变量中插入 bash 脚本

我创建了一个自定义 PS1 变量,这非常令人困惑。以下是最接近完全正常工作的一个:

PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD:\w [\e[1;34m]此文件夹有 \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') 个文件 [\e[1;33m]总共有 \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n`if [ \$? = 0 ]; then echo [\e[32m]^_^ [\e[0m] 有效 - [\e[0m]; else echo [\e[31m]O_O[\e[0m]无效 - ; fi`"

这是与前面的代码示例相同的代码,但已被分成块并添加注释以提高可读性:

#User@Host [Red]
\n\[\e[1;31m\]\u@\H

#Hour [Purple]
\[\e[35m\] \@ 

#PWD [Green]
\[\e[32m\] PWD: \w 

#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files 

#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n

#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`

尝试解释一下这个问题:

  • if寻找在运行 for 之后不再为假的条件(例如)"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files",因为如果最新的语句有一个干净的结束,它就是真的。

我怎样才能让它工作,同时保持输出在同一位置?如果将 if 移到执行第一个命令之前,它就可以正常工作。

我曾想过if在 PS1 的开头用该条件分配一个变量。然后其他if位于该位置的变量将判断不会改变的替代变量。但不幸的是,我对 Bash 一窍不通。我已经尝试过一千次左右,但都没有成功。

类似于这样(但写得很好):

PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\` 
...[Some more code in between]...
`if [ \$prev_err = 0 ]
    then echo "No error"
    else echo "There was an error in the statement." 
fi\`"

前一个代码块中的一些 `(反引号字符)位置错误或者被省略。

答案1

你最好在 PROMPT_COMMAND 中完成大部分操作,引用 Bash 手册的话“如果设置,则在发出每个主提示之前,该值将作为命令执行”

也可以看看这个巨大的例子

我的是 :-

PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'

这使得我的历史记录在各个终端窗口保持同步。

那么您可能应该将尽可能多的内容放入 bash 函数中以简化问题。

顺便说一句 - 你可能会发现它比仅仅获取文件使用情况du -sh .更有用和更容易`/bin/ls -lah | /bin/grep -m 1 total

答案2

我的提示包含几个功能,例如

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'

那对你有用吗?

相关内容