将单词尾随的‘n’个字符解释为参数的函数

将单词尾随的‘n’个字符解释为参数的函数

有没有办法通过尾随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可能正是您想要的。

相关内容