So führen Sie einen Shell-Befehl in einem zsh-Design mit Oh My Zsh aus

Also, ich habe Oh My Zsh am Laufen und erstelle mein eigenes neues zsh-Thema. Darin möchte ich die externe IP-Adresse von https://api.myip.com abrufen - und ich verwende curl & grep, um sie abzurufen. Funktioniert einwandfrei, wenn ich es an der Eingabeaufforderung eingebe, aber wenn es in meine zsh-theme-Datei eingebettet wird, gibt es mir einen Fehler:

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

Hier ist mein zsh-Thema:

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=""

Und hier ist die Befehlssequenz, die die IP-Adresse erfasst:

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])'

Antworten (1)

Erstens $()werden Befehle nicht innerhalb von einfachen Anführungszeichen ausgeführt. Das Ändern Ihrer äußeren Anführungszeichen in ""sollte dies beheben. Dies behebt auch das Problem, bei dem die inneren Anführungszeichen die Zeichenfolge vorzeitig schlossen (wie Sie an der Syntaxhervorhebung sehen können).

Zweitens scheint der innere Teil auf meinem Computer defekt zu sein, da Sie einen festen regulären Ausdruck verwenden. Der Server gibt mir eine IPv6-IP-Adresse zurück, aber dieser reguläre Ausdruck sucht nach einer IPv4-Adresse. Sie können das beheben, indem Sie den regulären Ausdruck ändern (außerhalb des Geltungsbereichs dieser Frage), aber ich schlage vor jq, . Damit können Sie ein Befehlszeilendienstprogramm verwenden, um JSON-Daten zu analysieren. Wenn Sie sich mit einer IPv4-Adresse mit diesem Server verbinden, ist diese Änderung wiederum nicht erforderlich (bis Ihr ISP Sie in Zukunft auf eine IPv6-Adresse aktualisiert).

Ich schließe daher mit

"%F{white}%M %n %y %j $(curl -s https://api.myip.com | jq .ip -r) %F{green}%2c%F{blue} [%f "
Ich gehe davon aus, dass das OP seine IP-Adresse jedes Mal aktualisieren möchte, wenn die Eingabeaufforderung angezeigt wird. Daher ist das curleinmalige Ausführen beim Start der Shell möglicherweise nicht das, was es benötigt. Sie sind vielleicht besser dran, wenn sie '...'beim Definieren PROMPT(oder dort verwenden "...") dem Inneren entkommen.
Ah, guter Punkt. Ich würde dies angehen, indem ich die Auswertung mit maskiere \$(curl...und hinzufüge setopt prompt_subst, damit ZSH jedes Mal, wenn die Eingabeaufforderung angezeigt wird, eine Auswertung durchführen kann. unix.stackexchange.com/a/297700/367868
Was ist damit: $(sysctl hw.ncpu | grep -o -E '[0-9]+'). Auch hier funktioniert es in der Eingabeaufforderung einwandfrei, aber wenn es in mein zsh-Theme eingefügt wird, heißt es.zsh: no matches found: [0-9]+
Ups - ich habe es wieder getan. Ha. Ja, es sind die einfachen Anführungszeichen, die beide Male das Problem sind. Da war mir kurz etwas langweilig :)