Могу ли я создать псевдоним для `set -l` в оболочке рыбы?

Я свободно использую set -l/set --local в своих скриптах для рыбы, поэтому я решил создать для него псевдоним. Имя local кажется подходящим. К сожалению, очевидный подход не работает:

function local
  set -l $argv
end

Это не удается, потому что, конечно же, создаваемая переменная является локальной для самой функции local. Использование alias также не работает, так как это просто (возможно, устаревшее) сокращение для вышеуказанной функции.

Есть ли способ создать локальную переменную в области вызова, не делая ничего более сложного, чем local foo 'bar'? Очевидно, я мог бы заставить что-то вроде eval (local foo 'bar') работать, но это как бы противоречит цели. Я открыт для любых уловок или хаков, которые заставят эту работу работать, если таковые существуют.


person Alexis King    schedule 02.07.2015    source источник


Ответы (1)


Боюсь, что нет, локальные переменные всегда являются локальными для самой верхней области видимости, и нет способа обернуть set без создания новой области. Лучшее, что вы можете сделать, это:

function def --no-scope-shadowing
    set $argv 
end

Это создает переменную в области действия вызывающей функции. Это немного отличается от локального: локальное относится к блоку, а вышеприведенное относится к функции. Тем не менее, этого может быть достаточно для вашего варианта использования.

person ridiculous_fish    schedule 02.07.2015
comment
Ах хорошо. Примерно так я и подозревал, но приятно знать наверняка. Пример, который вы привели, мало что дает, поскольку он идентичен простому set, но это нормально. Спасибо за официальный ответ! - person Alexis King; 02.07.2015