![将单词尾随的‘n’个字符解释为参数的函数](https://linux22.com/image/1409301/%E5%B0%86%E5%8D%95%E8%AF%8D%E5%B0%BE%E9%9A%8F%E7%9A%84%E2%80%98n%E2%80%99%E4%B8%AA%E5%AD%97%E7%AC%A6%E8%A7%A3%E9%87%8A%E4%B8%BA%E5%8F%82%E6%95%B0%E7%9A%84%E5%87%BD%E6%95%B0.png)
有没有办法通过尾随n一个命令的字符传递给一个函数,以便它作为两个命令执行?例如,我将函数定义为 abcx,每当我输入
abcxfoo
到命令行,我的函数将其解释为abcx foo
。我知道传递诸如$1
和之类的参数$@
,但在某些情况下,像上面那样定义一次的函数确实可以节省时间。
我指的是,我有很多cd
别名,我想这样称呼它们cdlinux
,这让我改成〜/文档/Linux,而不需要为我的每个文件夹定义一个别名文件(这就是我迄今为止所做的)。
答案1
你不能完全做到这一点,但只要稍加努力并使用 bash 4,你就可以实现该功能。
当 bash 4 遇到未定义的命令时,它会查找调用的 shell 函数command_not_found_handle
,如果找到,它会调用它,并将未找到的命令名称作为传递$1
,其余参数作为$2
...
因此,例如,您可以通过在文件中添加类似这样的内容来处理cd
和命令。(注意:我在这里不处理不区分大小写的问题,因此还有一些工作要做。)ffdir
.bashrc
command_not_found_handle() {
case $1 in
cd*) if [[ -d "$HOME/Documents/${1#cd}" ]]; then
cd "$HOME/Documents/${1#cd}"
return 0
fi
# On failure, falls through to the error message
;;
ffdir*) find . -type d -iname "${1#ffdir}"
return 0
;;
# Etc...
esac
# If nothing else works, just do what bash would have done
printf "%s: command not found\n" "$1" >&2
return 127
}
答案2
不。你要求的是不可能的,shell 怎么能猜出函数名的结尾呢?它需要一个空格来知道它应该尝试将你写的内容解释为命令。
然而,你正在寻找的可能是CDPATH
环境变量:
路径
以冒号分隔的目录列表,用作 cd 内置命令的搜索路径。
用法cd
如下:
光盘
cd [-L|[-P [-e]]] [directory]
将当前工作目录更改为 directory。如果没有指定 directory,则使用 HOME shell 变量的值。如果 shell 变量 CDPATH 存在,则将其用作搜索路径。如果目录以斜杠开头,则不使用 CDPATH。
换句话说,如果您像这样CDPATH
设置:~/.bashrc
export CDPATH=".:~/Documents"
然后,您将能够cd
使用制表符补全列出 的所有子目录,~/Documents
就像您已经在 内一样~/Documents
。
另一种方法是使用函数。只需将其添加到您的~/.bashrc
:
cddoc(){
cd "$HOME/Documents/$1"
}
但是,这样做的缺点是 tab 补全功能无法使用。您可以绕过这个问题,但这并不值得,因为这CDPATH
可能正是您想要的。