2015-09-02 4 views
11

Wie in this answer gezeigt, ist es möglich read mit Readline (-e) in bash zu verwenden Vorgeschichte Artikel zurückzukehren, indem sie die nach oben und unten Tasten:Wie macht man mit den Pfeil-nach-oben- und Pfeil-nach-unten-Tasten Verlaufseinträge in einem Skript mit zsh?

#! /usr/bin/env bash 

while IFS="" read -p "input> " -e line; do 
    history -s "$line" # append $line to local history 
done 

Was ist der richtige Weg, dies in zsh zu tun? (Benutzereingaben in einer Schleife erhalten und das Beenden des Schlüsselverlaufs zulassen). Das funktioniert nicht:

#! /usr/bin/env zsh 

while IFS="" vared -p "input> " -c line; do 

done 

Ich denke, Verlaufsvervollständigung ist standardmäßig für Skripts in Zsh deaktiviert. Außerdem möchte ich nicht, dass die Historie von der Shell kommt, sondern von der Eingabe, die im Skript eingegeben wird.

Antwort

2

Ich glaube, du bist für etwas in dieser Richtung zu fragen ... ungetestet

#! /bin/zsh -i 

local HISTFILE 
# -p push history list into a stack, and create a new list 
# -a automatically pop the history list when exiting this scope... 
HISTFILE=$HOME/.someOtherZshHistoryFile 
fc -ap # read 'man zshbuiltins' entry for 'fc' 

while IFS="" vared -p "input> " -c line; do 
    print -S $line # places $line (split by spaces) into the history list... 
done 

[EDIT] Hinweis I -i in die erste Zeile hinzugefügt (#!). Es ist lediglich eine Möglichkeit anzugeben, dass die Shell im interaktiven Modus ausgeführt werden muss. Der beste Weg, dies zu erreichen, ist einfach das Skript mit zsh -i my-script.zsh ausführen, weil die Weitergabe von Argumenten an #! Befehle unterscheidet zwischen Linux und OSX, so ist es im Prinzip etwas, auf das man sich nicht verlassen sollte.

Ehrlich, warum starten Sie nicht einfach eine neue interaktive Shell mit einer benutzerdefinierten Konfiguration und (falls notwendig) Hooks zwischen den Befehlen? Der beste Weg, dies zu erreichen, ist wahrscheinlich nur eine neue Shell mit verschiedenen Konfigurationsdateien eine neue Geschichte zu starten.

Dies ist ein viel besserer Weg, dies zu tun:

mkdir ~/abc 
echo "export HISTFILE=$HOME/.someOtherZshHistoryFile;autoload -U compinit; compinit" >! ~/abc/.zshrc 
ZDOTDIR=~/abc/ zsh -i 

Sie die Konfigurationsdatei des Skripts ändern können dann andere Anpassungen vornehmen Sie benötigen (andere Farbe prompt, spart keine Geschichte usw.).

Um tatsächlich zu tun Dinge mit der Benutzereingabe, eine der vielen Haken von add-zsh-hook

+0

Danke für die Antwort behandelt nutzen sollten! 'setopt interactive' funktioniert jedoch nicht. – nachocab

+0

das funktioniert tatsächlich nicht. Dieses Flag kann nicht gesetzt werden, sobald die Shell aktiv ist. Ich habe das Skript leicht bearbeitet. In jedem Fall sollten Sie nur eine normale interaktive Shell verwenden, keine Konfigurationsdateien – Francisco

+0

Hmm, es funktioniert immer noch nicht (ich bin auf OSX und ich bekomme einen Piepton, wenn ich die Pfeiltasten benutze). Der Grund, warum ich es nicht als eine neue Shell betreibe, ist, dass dies nur ein Spielzeugbeispiel ist. Das eigentliche Skript macht andere Dinge mit den Benutzereingaben. – nachocab

Verwandte Themen