我可以在 fish shell 中为 `set -l` 创建一个别名吗?

Can I make an alias for `set -l` in the fish shell?

我在我的 fish 脚本中大量使用 set -l/set --local,所以我考虑为它创建一个别名。 local 这个名字似乎很贴切。不幸的是,显而易见的方法不起作用:

function local
  set -l $argv
end

这失败了,因为当然,这创建的变量是 locallocal 函数本身。使用 alias 也不起作用,因为它只是上述功能的(可能是遗留的)shorthand。

有没有什么方法可以在调用范围内创建一个局部变量,而无需做比 local foo 'bar' 更复杂的事情?显然,我可以使 eval (local foo 'bar') 之类的东西起作用,但这会有点违背目的。我愿意接受任何可以使这项工作成功的诡计或技巧,如果存在的话。

恐怕不是,局部变量总是局部于最顶层的作用域,并且没有创建新作用域的情况下无法包装 set。你能做的最好的是:

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

这会在调用函数范围内创建一个变量。这与 local 有细微的不同:local 的作用域是块,而 above 的作用域是函数。对于您的用例来说仍然足够了。