AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 427748
Accepted
pfnuesel
pfnuesel
Asked: 2018-03-03 10:52:10 +0800 CST2018-03-03 10:52:10 +0800 CST 2018-03-03 10:52:10 +0800 CST

关闭一个命令标志和无限递归

  • 772

由于它在多个终端使用时会覆盖我的历史记录,所以我想关闭该功能fc -W。不幸的是,我有经常打字的习惯。

我认为不可能创建别名,因为fc -W.

所以我尝试制作一个函数,如下所示:

# Make sure to never invoke fc -W
fc(){
    for x; do
        if [[ "${x}" == -W ]]; then
            echo "I'm sorry Dave. I'm afraid I can't do that."
            return
        fi
    done
    fc "${@}"
}

但是,现在调用fc "${@}"调用自身,我得到了无限递归。通常我会通过使用 eg/usr/bin/fc而不是 来避免这种情况fc,但是:

$ type fc
> fc is a shell builtin

在这种情况下如何避免无限递归?或者是否有更好的方法来禁用命令的一个标志?

zsh alias
  • 2 2 个回答
  • 243 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-03-03T10:56:34+08:002018-03-03T10:56:34+08:00

    使用builtin:

    builtin fc "$@"
    

    fc这将确保调用内置命令。


    样式:诊断消息应进入标准错误流,并且函数在失败时应返回非零状态:

    echo 'Sorry, can not do that' >&2
    return 1
    
    • 4
  2. Gilles 'SO- stop being evil'
    2018-03-03T12:33:58+08:002018-03-03T12:33:58+08:00

    您可以覆盖内置命令或外部命令或具有别名的函数。在执行别名时,不会扩展具有相同名称的别名。因此,如果别名的扩展使用别名的名称,这将调用同名的内置或外部命令或函数。这意味着您可以以一种简单的方式使用别名来将额外的选项传递给命令。但是由于别名扩展的工作方式,您不能做更多的事情——它是一个简单的单词替换,没有评估。

    您可以使用函数覆盖内置命令或外部命令。具有特定名称的函数当前正在执行的事实不会影响执行,特别是不会影响函数名称的含义:它一直引用该函数。递归函数在 shell 编程中并不常见,但也没有反对它们的规则。

    command在 POSIX shell 中,您可以通过在调用之前放置来强制名称引用内置或外部命令。换句话说,command绕过别名和函数。在 zsh 中,command强制调用外部命令(除非posix_builtins设置了该选项),即它也绕过内置命令。要强制执行 zsh 中的内置命令,请使用builtin内置命令。

    这导致了一种解决方案:在您的包装函数中,调用builtin fc而不是fc.

    但是,这不一定是您情况下的最佳解决方案,因为您的函数将在任何地方调用,包括fc从其他函数调用。当您覆盖内置行为时,我建议坚持使用别名。别名仅适用于您在命令行键入的内容或使用.(aka source)加载的内容,不适用于加载的函数autoload -U(这是自动加载函数的推荐方法)。因此,定义一个fc调用包装函数的别名,并为包装函数指定一个不同的名称。

    fc_wrapper () {
        for x; do
            if [[ "${x}" == -*W* ]]; then
                echo >&2 "I'm sorry Dave. I'm afraid I can't do that."
                return 1
            fi
        done
        \fc "${@}"
    }
    alias fc=fc_wrapper
    

    我把\fc而不是fc放在函数定义中。从别名定义之前加载定义时,这不是必需的.zshrc,但这是必需的,例如,如果您在交互式会话期间编辑或重新加载函数定义。我也对该功能进行了一些小改进:

    • 在标准错误上打印错误消息。
    • 如果您没有完成这项工作,请返回错误状态。
    • 还捕获诸如fc -WI. 这并不完全可靠,因为它还会捕获诸如fc -R -- -W(从名为 的文件中读取历史记录-W)之类的调用,但对于此用例来说已经足够了。
    • 3

相关问题

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

  • Bash:为什么远程运行时忽略换行符后的别名?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve