gpt4 book ai didi

autocomplete - zsh 文件名通配/替换

转载 作者:行者123 更新时间:2023-12-04 04:39:02 24 4
gpt4 key购买 nike

我正在尝试创建我的第一个 zsh 完成脚本,在本例中用于命令 netcfg。

听起来可能很蹩脚,但免责声明,我知道如何粗略地做到这一点,但是我寻求“ZSH 方式”来做到这一点。

我需要列出/etc/networking 中的文件,但只列出文件,而不是目录组件,因此我执行以下操作。

echo $(ls /etc/network.d/*(.))

/etc/network.d/ethernet-dhcp /etc/network.d/wireless-wpa-config

我想要的是:
ethernet-dhcp wireless-wpa-config

所以我尝试(原谅我的天真):
echo ${(s/*\/)$(ls /etc/network.d/*(.))}

/etc/network.d/ethernet-dhcp /etc/network.d/wireless-wpa-config

似乎这行不通,我相信一定有一些聪明的方法可以通过拆分为数组并获取最后一部分来做到这一点,但正如我所说,我完全是菜鸟。

感激地收到任何建议。

最佳答案

一般注意事项:不需要使用 ls 来生成文件名。你不妨用 echo some*glob .但是,如果您想保护可能嵌入的换行符,那也是个坏主意。下面的第一个示例直接将 glob 放入数组以保护嵌入的换行符。第二个使用 printf 生成 NUL 终止的数据,以在不使用变量的情况下完成相同的事情。

如果您愿意使用变量,这很容易做到:

typeset -a entries
entries=(/etc/network.d/*(.)) # generate the list
echo ${entries#/etc/network.d/} # strip the prefix from each one

您也可以在没有变量的情况下执行此操作,但是隔离单个条目的额外内容有点难看:
# From the inside, to the outside:
# * glob the entries
# * NUL terminate them into a single string
# * split at NUL
# * strip the prefix from each one
echo ${${(0)"$(printf '%s\0' /etc/network.d/*(.))"}#/etc/network.d/}

或者,如果您无论如何要使用子shell(即上一个示例中的命令替换),只需 cd 到目录,这样它就不是 glob 扩展的一部分(另外,您不必重复目录名称):
echo ${(0)"$(cd /etc/network.d && printf '%s\0' *(.))"}

关于autocomplete - zsh 文件名通配/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3178402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com