【问题标题】:protect function to be not overridden in ZSH保护功能在 ZSH 中不被覆盖
【发布时间】:2016-08-06 23:41:11
【问题描述】:

我有一个定义了我的 ZSH 函数的文件,我从我的 zshrc 获取它。 有一组仅在该文件中的其他函数中使用的辅助函数。 我的问题是如何为这些助手保留可读的名称(例如“询问”等),并确保它们以后不会在其他源文件中被覆盖。 所以,例如我有两个功能:

helper() {
    # do something
}

function-i-want-to-use-in-shell() {
     helper # call helper, I want to be sure that it is 'my' helper
     # do something more
}

我想保护helper 在该文件中声明的函数。 如果我可以将这些函数包装在例如 subshel​​l () 然后将 function-i-want-to-use-in-shell 导出到父级(我知道这是不可能的),那就太好了; 因此,我正在寻找一种方便的方法来为这些函数创建类似它们自己的作用域,并使它们中的一些全局化和局部化。

[编辑] 我认为另一个例子可以更好地解释我想要实现的行为: 因此,对于第二个示例,我有两个文件:file1.shfile2.shfile1.sh 与上面的示例相同,在 file2.sh 中定义了另一个函数 helper。我想让你理解 helper 来自 file1.sh 它只是本地使用的功能(在那个文件中),只是代码的 sn-p。稍后在 shell 中,我只想使用来自file1.shfunction-i-want-to-use-in-shell 和来自file2.shhelper。我不希望helper 只读,我只希望它用于本地使用。也许我可以为file1.sh 中的函数执行类似“namespace”的操作,或者以某种方式在该文件中实现类似 javascript 的范围查找行为。我现在看到的唯一方法是拒绝保留我的辅助函数的良好、可读、自解释名称的条件,并且 给它们起其他人难以发明的名称,或为这些功能使用前缀。哦,我只是想在我的其他函数中写类似if ask "question"; then 但不是if my-local-ask "question"; then 之类的东西,并确保如果有人(或我自己)稍后定义另一个函数ask 什么都不会被破坏

【问题讨论】:

  • 我很惊讶typeset -rf helper 并不是所有你都将函数设为只读;这似乎是一件非常类似于 zsh 的事情。
  • @chepner 我不想将我的函数设为只读 我想将其设为仅限本地

标签: zsh


【解决方案1】:

这有点笨拙,但是您可以使用自动加载的函数来(如果不能防止覆盖函数)在调用之前轻松“重置”它。例如。

# Assumes that $func_dir is a directory in your fpath;
% echo 'print bar' > $func_dir/helper
% helper () { print 9; }
% helper
9
% unset -f helper
% autoload helper
% helper
bar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2022-11-30
    • 2019-12-04
    相关资源
    最近更新 更多