显示bash别名值的优雅解决方案
就像所有使用*nix
壳的人一样,我有大量的alias
es,我经常忘记我使用的alias
的详细信息。显示bash别名值的优雅解决方案
可能这是懒惰,但减少击键和命令执行可以提高我的生产力。所以我正在寻找一个干净的解决方案,为我在我的bash4
环境中定义的的每个别名执行以下操作:。
别名定义为:alias l='ls -laH'
期望的附加别名进入外壳之前被创建:alias l?='alias l'
期望的结果:$ l? alias l='ls -laH'
格式始终为"{alias_name}?"
目标不是必须为每个别名创建个别的"help"
别名。我可能迭代,但对我来说似乎笨重。
每一个别名,你可以采取command_not_found_handle
挂钩的优势:
command_not_found_handle() {
if [[ $1 =~ .*\? ]]; then
alias ${1%?}
else
printf "Command not found: $1\n"
return 127
fi
}
但是,?
是使用后缀的糟糕选择,因为它是与任何单个字符匹配的shell模式元字符。例如,如果当前目录中有一个文件与l?
(例如,la
)匹配,那么shell将尝试运行la
而不是l?
,并且您的自定义别名挂钩将不会运行。你可以使用set -f
来禁用globbing,但用l\?
调用你的别名钩子可能会更好。
另一种选择是使用@
—为“@lias” :) —代替?
为后缀触发挂钩,为@
不太可能在任何命令名称出现,而不是一个shell元字符。
嘿,Bash 4有AUTOLOAD/method_missing?我不知何故错过了这一点。谢谢! – 2014-09-23 12:11:59
这是一个真正优雅的解决方案。我意识到'?'是一个糟糕的选择,它以任何方式感到惊讶。 '@'是一个很好的建议。很好地完成了@chepner – 2014-09-24 22:05:15
编辑:如果您使用的是Bash 4,您可以使用command_not_found_handle
来执行此操作,正如chepner所建议的。我会接受这个答案来取代我的。
如果你坚持猛砸< = 3,不过,我怕你能做的最好是迭代,像这样的东西:
for a in $(alias | sed 's/alias \([^=]*\)=.*/\1/'); do alias "${a}?"="alias '$a'"; done
(挑选您最喜爱了提取别名的方式别名输出的..)
为了避免这种情况,我能想到的最接近的事是使?
本身就是一个别名(或其它字符;如chepner还指出,?
是单字符通配符,这可以使当前工作目录的内容随机炸毁你的别名)。您可以将其设为alias
本身的别名,以便您可以? l
而不是l?
,简单地为alias \?=alias
。正如您所说,自动完成可能会更好,您可以使用complete -a \?
。
优秀的解决方案,马克,谢谢 – 2014-09-23 02:27:19
您只需在命令提示符处键入alias
$ alias l
alias l='ls -laH'
注:调用alias
无参数显示由于您使用bash
4当前定义
我认为MarkReed的?
作为别名/函数解决方案是相当优雅的。
喜欢的东西:
alias ?=alias
complete -a ?
或:
?() {
for arg; do
if [ "$(type -t "$arg")" = alias ]; then
alias "$arg"
else
echo "No such alias: $arg"
fi
done
}
complete -a ?
使用功能(和bash 4)即使如此,你可以保持一个aliasinfo关联数组更多的使用/帮助/等。关于每个别名的信息,然后回显出来。
?() {
for arg; do
printf %s "${aliasinfo[$arg]:+"$aliasinfo[$arg]"$'\n'}"
if [ "$(type -t "$arg")" = alias ]; then
alias "$arg"
else
echo "No such alias: $arg"
fi
done
}
然后当你定义一个别名,你做这样的事情:
aliasinfo[l]="Full long directory listing"
alias l='ls -laH'
你不会是能够做到这一点没有迭代。最接近的就是将'?'作为别名的别名,所以你可以做例如'? l'。 – 2014-09-23 02:16:22
好的建议,也许我可以添加自动完成的?我希望能得到类似于lambda表达式的东西,但我想这与循环没有什么不同。 – 2014-09-23 02:19:51