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 / 问题 / 521968
Accepted
siryx
siryx
Asked: 2019-05-31 05:39:06 +0800 CST2019-05-31 05:39:06 +0800 CST 2019-05-31 05:39:06 +0800 CST

为历史扩展模式设置别名

  • 772

类似于我所$_学的现有代表!-1:$,我想为 , 等创建别名$__,$___以引用第二个或第三个 -last 命令。我试过添加

alias "$__"='!-2:$'

在我的.zshrc.local. 如果可能的话,我想写一个 zsh 函数,它根据下划线的数量返回第 n 个最后一个命令的第一个参数。

arch linux kernel 5.1.4-arch
zsh 5.7.1 (x86_64-pc-linux-gnu)
zsh alias
  • 1 1 个回答
  • 313 Views

1 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2019-05-31T12:34:01+08:002019-05-31T12:34:01+08:00

    此功能已存在

    您不需要任何复杂的东西来访问先前命令的最后一个字。只需按ESC-.(ie Alt+ .) 或ESC-_(ie Alt+ _)。这会调用编辑器命令insert-last-word,该命令会插入前一个命令行的最后一个单词。再次按该键以从命令行获取最后一个单词,依此类推。如果按ESC-.一次太多,请使用C-_(撤消)返回到之前的单词。

    此命令在 vi 模式下默认不绑定到键,但您可以将其绑定到bindkey.

    您可以传递一个数字参数来获取不同的单词:从右侧开始的正数(1 是最后一个单词),从左侧开始的零或负数(0 是第一个单词,通常是命令名称,1 是在第一个参数之后的单词等)。例如ESC . ESC - ESC 1 ESC .插入倒数第二个命令的第一个参数。

    通过在zle insert-last-word. Zsh 附带copy-earlier-word,smart-insert-last-word您可能会发现它对按原样使用或作为代码示例很有用。

    如果你真的想$__扩展到previous-but-one命令的最后一个单词,我会在下面给出一些解决方案,但首先我需要解释一下发生了什么。

    为什么您的尝试不起作用

    首先,你没有定义你认为你定义的东西。定义一个别名,其名称是执行别名定义时alias "$__"=…变量的当前值。__这可能是空的,因此您正在执行查找在搜索路径(文件名扩展的扩展部分)上alias ='!-2:$'调用的命令。要定义一个名为 的别名,您需要传递给 alias 命令,例如 with或。'!-2:$'=$__$__alias '$__'=…alias \$__=…

    其次,别名仅在命令位置扩展,即作为命令的第一个字(在任何前导变量分配和重定向之后)。为了使这个别名有用,它需要是一个全局别名:alias -g '$__'=…

    第三,这个别名不会做任何有用的事情,因为别名扩展发生在历史扩展之后。

    darkstar
    darkstar% alias -g '$__'='!-2:$'
    darkstar% echo $__
    !-2:$
    

    $_不“代表” !-1:$。$_并且!-1:$是在常见情况下访问相同信息的两种方式。你可以说$_“是 的别名” !-1:$,或者反过来说!-1:$“是 的别名” $_,但这是在一般英语意义上使用“别名”,而不是在 shell 别名的技术意义上使用,而且不精确,因为两者都没有t 始终具有相同的值。!-1:$是一个历史扩展( !) 构造,它扩展到前一个命令行( ) 的最后一个单词( :$) 。是一个使用参数-1$_parameter expansion_shell 将其设置为前一个命令的最后一个参数。如果您运行的命令行不完全是一个简单的命令,则会有所不同,例如:

    darkstar% for x in 1 2 3; do echo $x; done
    1
    2
    3
    darkstar% echo $_ is not !-1:$
    echo $_ is not done
    3 is not done
    darkstar% echo $_ and !-1:$ are different; echo $_ and !-1:$ are different
    echo $_ and done are different; echo $_ and done are different
    done and done are different
    different and done are different
    

    定义$__每个命令

    您可以定义一个称为陷阱函数TRAPDEBUG,该函数在执行每个命令之前运行。记住 的当前值$_(请注意,您必须先执行此操作,因为陷阱内的第一个命令将覆盖_),然后“移位”多个下划线变量。

    darkstar% TRAPDEBUG () { _0=$_; ___=$__; __=$_1; _1=$_0; }
    darkstar% echo one        
    one
    darkstar% echo two        
    two
    darkstar% echo three      
    three
    darkstar% echo $_,$__,$___
    three,two,one
    

    $_1不会总是与 相同$_,因为调试陷阱不会在导致_设置的完全相同的情况下运行,但它非常接近。

    定义$__每个命令行

    您可以注册一个钩子函数以在输入命令行之前或之后运行。在这种情况下,要么precmd要么preexec。它们分别在执行命令之前和之后运行。

    preexec_set_underscore_variables () {
      ___=$__
      __=$_1
      _1=$historywords[1]
    }
    preexec_functions+=(preexec_set_underscore_variables)
    

    我用来historywords从命令行获取最后一个单词。我把它存起来,_1因为_已经被拿走了。并且该函数将最后一个单词的历史变量“移动”一个。

    darkstar% echo one
    one
    darkstar% echo two
    two
    darkstar% echo three
    three
    darkstar% echo $_ $__ $___
    three two one
    
    • 1

相关问题

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

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

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

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

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

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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