哇!我在这里浏览类似问题已经 2 小时多了!我确定我只想要一个非常简单的东西。
在包含许多函数的 bash 会话中,我们需要访问数十个目录。它们的名称都保存在以 开头的变量中$zv
。我们使用变量是因为实际名称很长。
有些很简单,而且容易记住,比如$zvv
。但是也会$zvdirection
出现类似的东西。关键是可用变量列表$zv...
会发生变化。用户永远不知道哪些变量可用。有些将是全新的,自动生成的。
所以她通常会这样做:
cd $zv <tab> <tab>
没什么难的。她得到一个列表,然后手动完成她的cd $zv
行。但这些用户需要快速、始终使用这些目录,并且经常使用$zv...
隐藏脚本生成的新变量。
所以。我花了 2 个多小时尝试的是一个函数,比如说zv
,它将向他们显示所有当前可用的$zv...
自动完成功能,然后希望还能在提示符下给他们cd $zv
,其中 bash 正在等待他们添加剩余的字符。
我很确定这个功能一定是一行程序,但我被难住了!
答案1
用这个:
arr=()
while read v; do arr+=( "$(printf "%s=%s" "$v" "${!v}")" ); done < <(compgen -v zv)
select i in "${arr[@]}"; do cd "${i#*=}"; break; done
这使用select
内置的 bashs 来提供简单的基于菜单的对话框。
arr=()
初始化数组while ...
读取输入并填充数组。arr+=( "..." )
向数组中添加新条目。printf "%s=%s" "$v" "${!v}"
...打印变量名称及其内容。
compgen -v zv
生成键入时将完成的所有变量的列表$zv<tab><tab>
。- 此列表用于
select
生成菜单。cd "${i#*=}"
这cd
将进入第一次出现之后变量中给出的目录中=
。