如何评估鱼中的变量

How to evaluate variables in fish

我正在尝试来自 zsh 和 bash 的鱼 shell。我非常想念 $_ 位置参数,并试图用一个函数来模仿它。

Fish 在 $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 $_ 没有按预期工作?

因为 fish 没有全局别名。您给 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

在 fish 中,$_ 是一个只读变量,包含最后一个前台作业。但是,您可以使用 $__ 或其他字符。

最简单的选择是在每个命令后更新 $__

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

现在 $__ 将始终包含最后一个参数。