如何评估鱼类中的变量

时间:2016-04-05 17:02:32

标签: command-line-interface fish

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

Fish在$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

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

这里有什么问题?为什么j2objc-0.9.8.2.1/include/J2ObjC_header.h:25:17: error: cannot create __weak reference in file using manual reference counting id JreStrAppend(__weak id *lhs, const char *types, ...); 没有按预期工作?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分: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