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

lui*_*gal 5 shell bash prompt quoting command-substitution

我直接在命令提示符 (PS1) 中使用这段代码,它告诉我前一个命令是否正确执行。

PS1="\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[?? ]\"\e[0m; else echo -e \"\e[1;31m[ ]\"\e[0m; fi\`-[\u@\h: \w]"
Run Code Online (Sandbox Code Playgroud)

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

另外,这是否会干扰另一个脚本的结果?我已经公开了一个在命令提示符下调用的函数,但是这一段弄乱了结果。该函数仅在导出 PS1 时调用一次,而不是每次加载命令提示符时调用。

更新 1:所以我尝试了普通的“$()”,但没有用。而且,现在我更困惑了,因为如果给它添加一个反斜杠的话——“\$()”。为什么是这样?有人知道吗?“$”需要转义吗?

原作:

export PS1="[\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[?? ]\"\e[0m; else echo -e \"\e[1;31m[ ]\"\e[0m; fi\`]-[\u@\h: \w] \$ "
Run Code Online (Sandbox Code Playgroud)

结果:

[?? ]-[rordev@Luiss-MBP: ~/Development/test] $
Run Code Online (Sandbox Code Playgroud)

这不起作用:

export PS1="[$(if [ $? = 0 ]; then echo -e \e[1;32m[?? ]\e[0m; else echo -e \e[1;31m[ ]\e[0m; fi)]-[\u@\h: \w] \$ "
Run Code Online (Sandbox Code Playgroud)

结果:

-bash: 32m[??: command not found
[e[1]-[rordev@Luiss-MBP: ~/Development/test] $
Run Code Online (Sandbox Code Playgroud)

但这有效。为什么?为什么之前需要反斜杠$()

export PS1="\$(if [ \$? = 0 ]; then echo -e \"\e[1;32m[?? ]\"\e[0m; else echo -e \"\e[1;31m[ ]\"\e[0m; fi)-[\u@\h: \w] \$ "
Run Code Online (Sandbox Code Playgroud)

结果:

[?? ]-[rordev@Luiss-MBP: ~/Development/test] $ 
Run Code Online (Sandbox Code Playgroud)

更新 2:我尝试了这些建议并且它有效。嗯,有点。

我必须先调用条件,最后调用函数。

PS1="\$(if [ \$? = 0]; then ...; else ...; fi)-[\u@\h: \w\$(myFunction)]"
Run Code Online (Sandbox Code Playgroud)

但它不能以其他方式工作。

PS1="[\u@\h: \w\$(myFunction)]-\$(if [ \$? = 0]; then ...; else ...; fi)"
Run Code Online (Sandbox Code Playgroud)

函数被调用并显示结果,但条件似乎没有执行,或者返回的状态代码似乎总是0。所以它总是显示条件的第一部分。

对此有什么想法吗?我怀疑它与执行命令替换的顺序有关。

ilk*_*chu 9

PS1="\`if [ \$? = 0 ]; then ... fi\`
Run Code Online (Sandbox Code Playgroud)

更新:所以我尝试了普通的“$()”,但没有用。而且,现在我更困惑了,因为如果给它添加一个正斜杠就可以了——“\$()”。

\是一个反斜杠,而不是正斜杠。

您需要转义$此处的原因与您在第一个片段中转义反引号的原因相同:因为否则命令替换会在设置时立即展开PS1,而不是何时PS1用于生成提示。

您最好在赋值周围使用单引号,它们将防止扩展整个字符串的变量和命令替换。

PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '
Run Code Online (Sandbox Code Playgroud)

请注意,您需要将转义码包装在其中\[ ... \]以告诉 bash 它们不打印,并且在计算提示的宽度时不应将它们考虑在内(在手册中顺便提到)。(不知道Bash能否正确处理你使用的图形字符,无法测试。)

  • ANSI 颜色的正确转义码不需要封闭的方形背景] (2认同)

Ale*_*ira 0

\n

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

\n
\n\n
\n

函数被调用并显示结果,但条件似乎没有执行,或者更确切地说,返回的状态代码似乎始终为 0。因此它总是显示条件的第一部分。

\n

对此有什么想法吗?我怀疑这与命令替换的执行顺序有关。

\n
\n
    \n
  • 我的建议是将所有逻辑转移到PROMPT_COMMAND变量以使事情变得清晰。\n正如Bash Prompt Howto
    中所述,该变量的内容在Bash 显示提示之前作为常规 Bash 命令执行,这意味着在调用 $PS1
  • \n
\n

例如:

\n
    # Notice that we need to save the exit status to preserve it\n    # and avoid what you are reporting(always returning 0)\n    choose_icon() {\n        RET=$?; # Save the exit status\n        # Using short circuit evaluation to make statement shorter\n        [[ $RET != 0 ]] && ISTATUS= || ISTATUS=\xe2\x9a\xa1\xef\xb8\x8f\n        return "$RET" # Return the original exit status to your shell\n    }\n    PROMPT_COMMAND="choose_icon" # or/and any other function/command\n    PS1=\'[$ISTATUS]\\u@\\h \\w\\$ \'\n
Run Code Online (Sandbox Code Playgroud)\n