2016-04-05 10 views
0

Ich probiere die Fisch-Shell, aus Zsh und Bash kommen. Ich vermisse den Positionsparameter $_ schmerzhaft und versuche, ihn mit einer Funktion zu imitieren.Wie Variablen in Fisch zu bewerten

Fisch enthält seine Befehlshistorie in einem $history Array, wobei $history[1] die vorherige Zeile in der Geschichte ist, $history[2] ist die davor, und so weiter.

Ich versuche, diese Variable zu bewerten und das letzte Wort wie dieses

ls -al 
echo $history[1] | awk '{print $NF}'   // Prints -al 

ich versucht habe, entpacken Sie es in einer Funktion wie dieser

function \$_ --description 'Fish-patch for the $_ positional parameter' 
    echo $history[1] | awk '{print $NF}' 
end 

setzen Aber es funktioniert nicht ganz so erwartet. Der Aufruf von $_ selbst funktioniert wie erwartet;

ls -al 
$_  

Es druckt -al. Aber wenn $_ als Parameter an eine Funktion übergeben wird;

ls -al 
echo $_ 

Es druckt echo. Ich vermute, dass es etwas mit der $_-Funktion zu tun hat, die in einer Subshell oder etwas bewertet wird, weiß ich wirklich nicht.

Was ist hier falsch? Warum funktioniert echo $_ nicht wie erwartet?

Antwort

4

In Fisch, $_ ist eine schreibgeschützte Variable. Sie könnten jedoch $__ oder ein anderes Zeichen verwenden.

Die einfachste Option ist nur $__ nach jedem Befehl zu aktualisieren:

function update_last_arg --on-event fish_postexec 
    set -g __ (echo $argv | awk '{print $NF}') 
end 

jetzt $__ wird immer das letzte Argument enthalten.

0

weil Fisch keine globalen Aliase hat. Die Argumente, die Sie echo geben, sind nur Zeichenfolgen, sie werden nicht als Code ausgewertet.

Sie müssen dies tun, was die Benutzerfreundlichkeit verringert.

echo ($_) 

fand ich (irgendwo) ein Verfahren zur Herstellung des Bash Geschichte wie !! und !$ Umsetzung:

den letzten Vordergrund Auftrag enthält
function fish_user_key_bindings 
    bind ! bind_bang 
    bind '$' bind_dollar 

    # enable editing command line in editor with Alt+v 
    bind \ev bind_edit_commandline 
end 
function bind_bang 
    switch (commandline -t)[-1] 
    case "!" 
     commandline -t $history[1]; commandline -f repaint 
    case "*" 
     commandline -i ! 
    end 
end 
function bind_dollar 
    switch (commandline -t)[-1] 
    case "!" 
     commandline -t "" 
     commandline -f history-token-search-backward 
    case "*" 
     commandline -i '$' 
    end 
end