bash 中的 zsh 后缀别名替代

bash 中的 zsh 后缀别名替代

在 zsh 中,我可以使用程序打开任何具有特殊后缀或扩展名(如 .log 或 .txt)的文件,只需键入其文件名

$ alias -s txt=nano
$ word.txt 

用nano打开文件word.txt。我怎样才能在 bash 中做到这一点?

答案1

怎么样exec zsh

但这个功能实际上可以在 bash 中实现(从 4.0 版本开始;OSX 用户,请参阅上一段)。有点儿。当 bash 遇到在 中找不到的命令时PATH,它会运行一个名为command_not_found_handle。如果文件是当前目录中的文件,您可以编写一个尝试打开该文件的函数。

typeset -A extension_aliases
command_not_found_handle () {
  if [[ $# -eq 1 && -e $1 && $1 = *.* ]]; then
    local handler="${extension_aliases[${1##*.}]}"
    if [[ -n $local_handler ]]; then
      eval "$local_handler \"\$@\""
      return
    fi
  fi
  return 127
}

而不是alias -s txt=nano使用extension_aliases[txt]=nano.

这种方法有局限性。该文件必须位于当前目录中,因为command_not_found_handle仅使用不包含斜杠的命令名调用。此外,您也无法完成文件名。

使用现有机制要简单得多:

xdg-open word.txt

或在 Debian 及其衍生产品上

see word.txt

您可以获得许多好处:已经有一个系统数据库将扩展映射到程序,完成将起作用,并且不需要 shell 进行任何特殊处理。它确实需要更多的输入,但您可以为其定义一个单字符别名(后面需要一个空格),或者xdg-open在行开头插入一个键绑定:

bind -x '"\eo": READLINE_LINE="xdg-open $READLINE_LINE"; READLINE_POINT+=9'

相关内容