有没有办法在命令行提示符(PS1)中执行代码而不使用反引号?

有没有办法在命令行提示符(PS1)中执行代码而不使用反引号?

我直接在命令提示符(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

我不喜欢反引号表示法,有没有办法在不使用``的情况下执行它?

函数被调用并显示结果,但条件似乎没有执行,或者更确切地说,返回的状态代码似乎始终为 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=

相关内容