1 votos

No puedo hacer que el zsh-theme actualice todos los scripts internos de la terminal con cada "return"

Aquí está mi nuevo tema de oh-my-zsh para zsh, actualizado con un carácter de escape antes de cada bloque de código dentro de $()'s que permite actualizar cada vez que se muestra el indicador (funciona con setopt prompt_subst):

PROMPT="%F{yellow}%n%F{white}@%F{green}%M %F{cyan}%j %F{white}\$(curl -s https://api.myip.com | jq .ip -r) %F{green}%2c%F{cyan} [%f "
RPROMPT="\$(git_prompt_info) %F{cyan}] %F{red}\$(top -l 1 | grep 'Load Avg' | awk '{print $3, $4, $5}' | tr -d , | awk '{print $2}')[\$(sysctl hw.ncpu | grep -o -E '[1-9]+')] @ \$(top -l 1 | grep 'CPU usage:' | awk '{print $3, $5, $7}' | tr -d , | awk '{print $3,"%%"}') idle %F{green}%W %* %F{yellow}%D{%p}%f"

ZSH_THEME_GIT_PROMPT_PREFIX="%F{yellow}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%f"
ZSH_THEME_GIT_PROMPT_DIRTY=" %F{red}*%f"
ZSH_THEME_GIT_PROMPT_CLEAN=""

Cambiará dinámicamente la fecha y la hora, la dirección IP, y la git_prompt_info, cada vez que presione enter, pero el scripting de shell como \$(top -l 1 | grep 'Load Avg' | awk '{print $3, $4, $5}' | tr -d , | awk '{print $2}') no se actualiza cada vez que presiono "enter", en su lugar me da un error:

awk: error de sintaxis en la línea de origen 1
 contexto es
    {print >>>  , <<<
awk: declaración ilegal en la línea de origen 1
awk: declaración ilegal en la línea de origen 1

¿Qué está pasando aquí?

1voto

siva Puntos 23
setopt prompt_subst

Habilita prompt_subst en tu zshrc u otro archivo referenciado por tu shell para que zsh reevalúe tu variable PS1 en cada aparición del prompt.

0 votos

Intenté colocar setopt prompt_subst en mi archivo .zshrc. Parece que nada cambió. Noté que mencionaste PS1 en lugar de PROMPT y RPROMPT. ¿Cuál es el equivalente de PS1 para RPROMPT?

0 votos

Actualicé mi pregunta para referirme a la evaluación de "desobediencia" de $( ) después de haber añadido exitosamente setopt prompt_subst y el carácter de escape \ antes de cada $( ).

1voto

user1934428 Puntos 113

Su problema se reduce a una asignación similar a esta:

 rp="\$(awk '{print $3, $5, $7}')"

Si prueba esto y luego hace un echo $rp, verá que el comando awk está realmente roto. La razón es la barra invertida inicial: Debido a esto, el constructo $(....) no representa un nuevo ámbito y estamos dentro de las comillas dobles (exteriores). Por lo tanto, la terminal sustituye las variables $.

Tiene dos posibilidades:

(1) Escapar el $

 rp="\$(awk '{print \$3, \$5, \$7}')"

(2) Usar comillas simples para la asignación. Por supuesto, esto significa que no puede tener comillas simples adentro. Ejemplo:

rp='$(awk "{print $3, $5, $7}")'

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X