2014-09-23 49 views
1

就像所有使用*nix壳的人一样,我有大量的alias es,我经常忘记我使用的alias的详细信息。显示bash别名值的优雅解决方案

可能这是懒惰,但减少击键和命令执行可以提高我的生产力。所以我正在寻找一个干净的解决方案,为我在我的bash4环境中定义的的每个别名执行以下操作:


别名定义为:
alias l='ls -laH'

期望的附加别名进入外壳之前被创建:
alias l?='alias l'

期望的结果:
$ l? alias l='ls -laH'


格式始终为"{alias_name}?"

目标不是必须为每个别名创建个别的"help"别名。我可能迭代,但对我来说似乎笨重。

+1

你不会是能够做到这一点没有迭代。最接近的就是将'?'作为别名的别名,所以你可以做例如'? l'。 – 2014-09-23 02:16:22

+0

好的建议,也许我可以添加自动完成的?我希望能得到类似于lambda表达式的东西,但我想这与循环没有什么不同。 – 2014-09-23 02:19:51

回答

3

每一个别名,你可以采取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元字符。

+0

嘿,Bash 4有AUTOLOAD/method_missing?我不知何故错过了这一点。谢谢! – 2014-09-23 12:11:59

+0

这是一个真正优雅的解决方案。我意识到'?'是一个糟糕的选择,它以任何方式感到惊讶。 '@'是一个很好的建议。很好地完成了@chepner – 2014-09-24 22:05:15

1

编辑:如果您使用的是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 \?

+0

优秀的解决方案,马克,谢谢 – 2014-09-23 02:27:19

0

您只需在命令提示符处键入alias

$ alias l 
alias l='ls -laH' 

注:调用alias无参数显示由于您使用bash 4当前定义

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'