在 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'