将此添加到您的.bashrc
:
_make_go_apps() {
local r=/var/virtual
local d qd
while read d; do
printf -v qd '%q' "$r/$d"
eval "go_${d%.com}() { cd -- $qd; }"
done < <( find "$r" -maxdepth 1 -regex ".*/app[0-9]+\.com" -type d -printf '%f\n')
}
这将创建go_appX
具有X
编号的函数,使得该目录/var/virtual/appX.com
存在,并且该函数在调用时将只cd
进入该目录。
看(别担心,我在沙盒中):
# mkdir -p /var/virtual/app{1..50}.com
# _make_go_apps
# go_app42
# pwd
/var/virtual/app42
完毕!
如果创建了新目录,则只需重新启动该功能_make_go_apps
。
此方法满足所有 OP 的要求,并且足够通用,可以处理任意数量的目录。
eval
是邪恶的,但以安全的方式使用(使用经过清理的变量读取,即使它在这里没用;但如果有一天你想推广这种方法,你至少会让这部分正确)。
除非您绝对知道自己在做什么,否则不要试图概括此方法:处理包含空格、换行符、尾随换行符等的文件名。
评论。
- 如果要更改位置
/var/virtual
,只需更改局部变量r
,确保它是绝对路径。
- 选项卡完成课程效果很好(选项卡选项卡将向您展示可能性)。
如果您删除一些目录,您可能希望 a_clean_go_apps
只保留相关的go_appX
. 一种可能性是(它会进入你的.bashrc
):
clean_go_apps() {
local r=/var/virtual
local f
while read _ _ f; do
[[ $f =~ ^go_app[[:digit:]]+$ ]] || continue
[[ -d $r/${f#go_}.com ]] && continue
unset -f $f
done < <(declare -F)
}
在这种情况下,请阅读下一部分。
然后你会意识到/var/virtual
在两个不同的地方放置不是一个好主意,所以你会想要使用一个全局变量,你最终会在你的.bashrc
:
readonly _go_apps_basedir=/var/virtual
make_go_apps() {
local d qd
while IFS= read -d '' d; do
printf -v qd '%q' "$_go_apps_basedir/$d"
eval "go_${d%.com}() { cd -- $qd; }"
done < <( find "$_go_apps_basedir" -maxdepth 1 -regex ".*/app[0-9]+\.com" -type d -printf '%f\0')
}
clean_go_apps() {
local f
while read _ _ f; do
[[ $f =~ ^go_app[[:digit:]]+$ ]] || continue
[[ -d "$_go_apps_basedir/${f#go_}.com" ]] && continue
unset -f $f
done < <(declare -F)
}
make_go_apps
我标记了变量_go_apps_basedir
readonly
,以免无意中更改它。这次我选择在 read 和命令中使用IFS=''
and来向你展示在解析.-d ''
-printf '%f\0'
find
find
我仍然担心函数中的find
in _make_go_apps
,因为它不是 100% 纯 bash 解决方案。这是一个 100% 纯 bash 解决方案:
readonly _go_apps_basedir=/var/virtual
make_go_apps() {
local f d qd saved_shopt
saved_shopt=$(shopt -p)
shopt -s extglob nullglob
for d in "$_go_apps_basedir"/app+([[:digit:]]).com/; do
f=${d#$_go_apps_basedir/}
printf -v qd '%q' "$d"
eval "go_${f%.com/}() { cd -- $qd; }"
done
eval "$saved_shopt"
}
clean_go_apps() {
local f
while read _ _ f; do
[[ $f =~ ^go_app[[:digit:]]+$ ]] || continue
[[ -d "$_go_apps_basedir/${f#go_}.com" ]] && continue
unset -f $f
done < <(declare -F)
}
make_go_apps
抱歉,这篇冗长的帖子很混乱……我打字时或多或少在思考(不好做!),我从不想删除前面的部分,因为它们包含有趣的东西。
编辑. 现在,为了让这篇文章更长,这里是一样的,但是这将为里面go_X
的每个目录创建一个函数,这样只包含字符:。把它放在你的:X.com
/var/virtual
X
[0-9a-zA-Z\-\._]
.bashrc
readonly _go_apps_basedir=/var/virtual
make_go_functions() {
local f d qd saved_shopt
saved_shopt=$(shopt -p)
shopt -s extglob nullglob
for d in "$_go_apps_basedir"/+([[:alpha:][:digit:]\-\._]).com/; do
f=${d#$_go_apps_basedir/}
printf -v qd '%q' "$d"
eval "go_${f%.com/}() { cd -- $qd; }"
done
eval "$saved_shopt"
}
clean_go_apps() {
local f
while read _ _ f; do
[[ $f =~ ^go_.+$ ]] || continue
[[ -d "$_go_apps_basedir/${f#go_}.com" ]] && continue
unset -f $f
done < <(declare -F)
}
make_go_functions