当我意外地在没有某种编辑器命令的情况下键入文本文件的名称,并且该文本文件不是 shell 脚本时,我收到“权限被拒绝”错误*,因为该文件不可执行,并且该文本文件中的第一个标记命令行被视为要执行的命令。
然而,这总是意味着我无意中忘记输入编辑器命令,因此如果 shell 能够以某种方式识别出第一个标记是一个没有设置“执行”位的现有文本文件并自动打开它,那就很方便了两者$EDITOR
任一$VISUAL
。
有没有办法在 Bash 或 Zsh 中实现这一点? (我使用 Bash,但无论如何我都在考虑切换。)这有点像 Bash 的autocd
选项,它会自动检测第一个标记是否是目录并尝试进入cd
它,而不是给出标准的“是目录”错误。
理想情况下,如果我给出文件列表(例如带有 glob)或任何其他参数集,全部这些参数的一部分将被传递给编辑器命令。
* 当然,如果我在当前目录中指定一个没有./
.
答案1
在zsh
,只要您的文本文件具有文件扩展名 ( file.ext
),您就可以使用后缀别名。它们由命令行上的第一个单词与任何非空字符串匹配时alias -s name=value
运行。value text.name
text.name
text
例如:
如果你定义
alias -s txt=vim
然后输入
$ foo.txt
在命令行上将运行
vim foo.txt
这适用于任何匹配的内容?*.txt
,甚至是带有通配符的单词:
$ *.txt
会跑
vim *.txt
它还仅检查命令的第一个单词,但会将整个命令行作为参数传递,即使其他单词有后缀别名:
$ foo.txt bar.c baz.vim
会跑
vim foo.txt bar.c baz.vim
重要的:这也会影响具有匹配扩展名的任何命令,包括PATH
.例如,您是否应该设置
alias -s sh=vim
并且您有一个名为的命令something.sh
并且想要运行
something.sh -p1 -p2 arg1 arg2
它会运行
vim something.sh -p1 -p2 arg1 arg2
要为一个命令禁用此功能,只需添加command
内置命令:
command something.sh -p1 -p2 arg1 arg2
明显的缺点是:
- 它仅适用于具有文件扩展名的文件
- 您必须为每个扩展显式定义别名
从积极的一面:
- 它仅适用于具有文件扩展名的文件,因此
/bin
和中的大多数可执行文件/usr/bin
都不会被别名替换。 - 您可以为任何扩展名定义一个(不同的)别名,这样
*.jpg
文件*.o
就不会突然被打开vim