我直接在命令提示符(PS1)中使用这段代码,它告诉我前面的命令是否正确执行。
PS1="\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[
答案1
PS1="\`if [ \$? = 0 ]; then ... fi\`
更新:所以我尝试了简单的“$()”,但它不起作用。而且,现在我更困惑了,因为如果添加一个正斜杠它就可以工作 - “\$()”。
这\
是一个反斜杠,而不是正斜杠。
您需要转义$
此处的原因与您在第一个片段中转义反引号的原因相同:因为否则命令替换会扩展立即地,当设置时PS1
,而不是当PS1
用于产生提示时。
您最好在赋值周围使用单引号,它们将防止扩展变量和整个字符串的命令替换。
PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '
请注意,您需要将转义码包装在其中\[ ... \]
以告诉 bash 它们不会打印,并且在计算提示符的宽度时不应该考虑它们(在传递手动的)。 (我不知道Bash是否可以正确处理你使用的图形字符,我无法测试。)
答案2
我不喜欢反引号表示法,有没有办法在不使用``的情况下执行它?
- 是的,替代语法命令替换 是使用表格
$(...)
,根据高级 Bash 脚本编写指南。
函数被调用并显示结果,但条件似乎没有执行,或者更确切地说,返回的状态代码似乎始终为 0。因此它总是显示条件的第一部分。
对此有什么想法吗?我怀疑这与命令替换的执行顺序有关。
- 我的建议是全部转移逻辑到提示命令变量使事情变得清晰。
正如所述Bash 提示操作指南 该变量的内容作为常规 Bash 命令执行 就在之前 Bash 显示提示,这意味着在调用$PS1
变量之前。
例如:
# Notice that we need to save the exit status to preserve it
# and avoid what you are reporting(always returning 0)
choose_icon() {
RET=$?; # Save the exit status
# Using short circuit evaluation to make statement shorter
[[ $RET != 0 ]] && ISTATUS=