显示bash别名值的优雅解决方案

时间:2014-09-23 02:13:27

标签: bash shell scripting alias

与使用*nix炮弹的每个人一样,我有大量的alias es,而且我经常忘记alias我使用的详情。

这可能是懒惰,但减少按键和命令执行可以提高我的工作效率。因此,我正在寻找一个干净的解决方案,在我的bash4环境中为我已定义的每个别名


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

在进入shell之前创建所需的其他别名:
alias l?='alias l'

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


格式始终为"{alias_name}?"

目标不是为每个别名创建单独的"help"别名。我可以迭代,但这对我来说似乎很笨拙。

4 个答案:

答案 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'