2016-04-05 79 views
0

我试着从zsh和bash来的鱼壳。我非常想念$_位置参数,并试图用函数来模仿它。如何评估鱼的变量

鱼在$history数组中包含其命令历史记录,其中$history[1]是历史上的前一行,$history[2]是之前的那一行,依此类推。

我试图评估该变量并提取这样

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

我试图把它放在这样的函数

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

的最后一个字,但它不是做得比较作为工作预期。调用$_本身按预期工作;

ls -al 
$_  

它打印-al。但是,如果$_作为参数传递给函数;

ls -al 
echo $_ 

它打印echo。我怀疑它与$_-函数在子shell或其他东西中被评估有关,我真的不知道。

这里有什么问题?为什么echo $_不按预期工作?

回答

4

在鱼,$_是只读包含上次前景化工作变量。但是,您可以使用$__或其他字符。

最简单的方法是每一个命令后只更新$__

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

现在$__总是包含最后一个参数。

0

因为鱼没有全局别名。你给echo的参数只是字符串,它们不会被视为代码。

你必须这样做,这减少了它的可用性。

echo ($_) 

我发现(地方)执行bash的历史般!!!$的方法:

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