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。所以它总是显示条件的第一部分。
对此有什么想法吗?我怀疑它与执行命令替换的顺序有关。
Run Code Online (Sandbox Code Playgroud)PS1="\`if [ \$? = 0 ]; then ... fi\`
更新:所以我尝试了普通的“$()”,但没有用。而且,现在我更困惑了,因为如果给它添加一个正斜杠就可以了——“\$()”。
该\
是一个反斜杠,而不是正斜杠。
您需要转义$
此处的原因与您在第一个片段中转义反引号的原因相同:因为否则命令替换会在设置时立即展开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能否正确处理你使用的图形字符,无法测试。)
\n\n我不喜欢反引号表示法,有没有办法在不使用``的情况下执行它?
\n
$(...)
它有几个优点。\n\n函数被调用并显示结果,但条件似乎没有执行,或者更确切地说,返回的状态代码似乎始终为 0。因此它总是显示条件的第一部分。
\n对此有什么想法吗?我怀疑这与命令替换的执行顺序有关。
\n
$PS1
。例如:
\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
归档时间: |
|
查看次数: |
2528 次 |
最近记录: |