Как оценивать переменные в рыбе

Пробую рыбий панцирь, идущий от zsh и bash. Мне очень не хватает позиционного параметра $_, и я пытаюсь имитировать его с помощью функции.

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. Я подозреваю, что это как-то связано с оценкой $_-функции в подоболочке или чем-то в этом роде, я действительно не знаю.

Что здесь не так? Почему echo $_ не работает должным образом?


person krystah    schedule 05.04.2016    source источник


Ответы (2)


В fish $_ - это переменная только для чтения, содержащая последнее задание, выполненное на переднем плане. Однако вы можете использовать $__ или другой символ.

Самый простой вариант - просто обновлять $__ после каждой команды:

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

теперь $__ всегда будет содержать последний аргумент.

person ridiculous_fish    schedule 05.04.2016

потому что у рыбы нет глобальных псевдонимов. Аргументы, которые вы передаете 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
person glenn jackman    schedule 05.04.2016