与使用*nix
炮弹的每个人一样,我有大量的alias
es,而且我经常忘记alias
我使用的详情。
这可能是懒惰,但减少按键和命令执行可以提高我的工作效率。因此,我正在寻找一个干净的解决方案,在我的bash4
环境中为我已定义的每个别名
别名定义为:
alias l='ls -laH'
在进入shell之前创建所需的其他别名:
alias l?='alias l'
期望的结果:
$ l?
alias l='ls -laH'
格式始终为"{alias_name}?"
目标不是为每个别名创建单独的"help"
别名。我可以迭代,但这对我来说似乎很笨拙。
答案 0 :(得分:3)
由于您使用bash
4,因此可以利用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
禁用通配,但使用l\?
调用别名挂钩可能会更好。
另一种选择是使用@
- 用于“@lias”:) - 而不是?
作为触发挂钩的后缀,因为@
不太可能出现在任何命令名称,不是shell元字符。
答案 1 :(得分:1)
编辑:如果您正在使用Bash 4,则可以使用command_not_found_handle
执行此操作,如下面的chepner所示。我会接受这个代替我的答案。
如果你坚持使用Bash< = 3,我担心你能做的最好就是迭代,用这样的东西:
for a in $(alias | sed 's/alias \([^=]*\)=.*/\1/'); do alias "${a}?"="alias '$a'"; done
(选择你最喜欢的从别名输出中提取别名的方法..)
为了避免这种情况,我能想到的最接近的事情就是让?
本身成为别名(或其他一些字符;正如chepner还指出的那样,?
是一个单字符的通配符,可以使当前工作目录的内容随机炸毁你的别名)。您可以将其设为alias
本身的别名,因此您可以执行以下操作: ? l
代替l?
,只需alias \?=alias
。正如您所说,自动填充可能会更好,您可以使用complete -a \?
。
答案 2 :(得分:0)
您只需在命令提示符中键入alias
$ alias l
alias l='ls -laH'
注意:不带参数调用alias
将显示当前定义的每个别名
答案 3 :(得分:0)
我认为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'