使用参数和自动完成的bash别名

Gad*_*lin 11 linux bash

我在路径中存在一堆脚本,所以无论我在哪里,我都可以访问每个脚本.有时这些是非常简单的util脚本"vim"文件.不时,我想快速查看脚本文件的内容和看到的文件路径的脚本打开(然后做猫,grep的...).

我想做一个别名,无论我在哪里,都会给出"cat".
鉴于一个不工作:
alias a="cat `which \$1`"
如果我放置脚本名称而不是参数号($ 1)它工作正常.但参数不是.

第二个问题(我希望生活如此美丽!)将自动完成该别名的脚本名称.
使用可能存在于我的"bin"目录中的脚本将是我可以采取的另一种方法.

sho*_*nex 6

对于带参数的别名,请使用函数而不是别名:

a() { cat `which $1` ;}
Run Code Online (Sandbox Code Playgroud)

或者,如果您在多行上执行此操作,请跳过分号:

a() {
    cat `which $1`
}
Run Code Online (Sandbox Code Playgroud)

您可以在shell提示符下以交互方式输入它:

shell:>a() {
>cat `which $1`
>}
shell:>
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 6

如果你的函数被称为"foo",那么你的完成函数可能如下所示:

如果您安装了Bash完成包:

_foo () { local cur; cur=$(_get_cword); COMPREPLY=( $( compgen -c -- $cur ) ); return 0; }
Run Code Online (Sandbox Code Playgroud)

如果你不这样做:

_foo () { local cur; cur=${COMP_WORDS[$COMP_CWORD]}; COMPREPLY=( $( compgen -c -- $cur ) ); return 0; }
Run Code Online (Sandbox Code Playgroud)

然后启用它:

complete -F _foo foo
Run Code Online (Sandbox Code Playgroud)

该命令compgen -c将使完成包含系统上的所有命令.

你的函数"foo"看起来像这样:

foo () { cat $(type -P "$@"; }
Run Code Online (Sandbox Code Playgroud)

cat名称作为参数传递的一个或多个文件.