Cómo ejecutar un comando de shell dentro de un tema zsh con Oh My Zsh

Entonces, tengo Oh My Zsh funcionando, y estoy creando mi propio nuevo tema zsh. En él, deseo obtener la dirección IP externa de https://api.myip.com , y estoy usando curl & grep para obtenerla. Funciona bien cuando lo ingreso en el símbolo del sistema, pero cuando está incrustado en mi archivo zsh-theme me da un error:

zsh: no matches found: ((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]).){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])
(23) Failed writing body

Jacobs-MacBook-Pro-2.local jacobjackson ttys002 0 [                               ] 10/29/20 18:32:46 PM

Aquí está mi tema zsh:

PROMPT='%F{white}%M %n %y %j $(curl -s https://api.myip.com | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])') %F{green}%2c%F{blue} [%f '
RPROMPT='$(git_prompt_info) %F{blue}] %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=""

Y aquí está la secuencia de comandos que toma la dirección IP:

curl -s https://api.myip.com | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])'

Respuestas (1)

En primer lugar, $()los comandos no se ejecutan entre comillas simples. Cambiar las comillas exteriores a ""debería solucionar este problema. Esto también soluciona el problema por el cual las comillas interiores cerraban prematuramente la cadena (como puede ver en el resaltado de sintaxis).

En segundo lugar, la parte interior parece estar rota en mi computadora ya que está usando una expresión regular fija. El servidor me devuelve una dirección IP IPv6, pero esa expresión regular busca una dirección IPv4. Puede solucionarlo cambiando la expresión regular (fuera del alcance de esta pregunta), pero sugeriré usar jq. Le permite usar una utilidad de línea de comandos para analizar datos JSON. Nuevamente, si se está conectando a ese servidor con una dirección IPv4, este cambio no será necesario (hasta que su ISP en el futuro lo actualice a una dirección IPv6).

por lo tanto termino con

"%F{white}%M %n %y %j $(curl -s https://api.myip.com | jq .ip -r) %F{green}%2c%F{blue} [%f "
Supongo que el OP quiere actualizar su dirección IP cada vez que se muestra el mensaje, por lo que ejecutar curluna vez cuando se inicia el shell puede no ser lo que necesitan. Podrían ser mejores escapando del interior '...'al definir PROMPT(o usar "..."allí).
Ah, buen punto. Abordaría eso escapando de la evaluación con \$(curl..., y agregando setopt prompt_subst, para permitir que ZSH haga una evaluación cada vez que se muestra el aviso. unix.stackexchange.com/a/297700/367868
Que tal esto: $(sysctl hw.ncpu | grep -o -E '[0-9]+'). Nuevamente, funciona bien en el símbolo del sistema, pero cuando se inserta en mi tema zsh, dice.zsh: no matches found: [0-9]+
Vaya, lo hice de nuevo. Ja. Sí, son las comillas simples el problema en ambas ocasiones. Estuve un poco aburrido allí por un momento :)