如何轻松地使别名命令永久生效?

如何轻松地使别名命令永久生效?

我到处搜索,几乎每个人都建议打开~/.bashrc~/.bash_aliases,然后将别名命令放在那里,我创建了一个函数名palias作为永久别名函数并将其放入~/.bashrc

function palias(){ echo "alias $1='$2'" >> /home/User/.bashrc;}

所以现在如果我想永久地为某个命令添加别名我只需:

palias update "sudo apt-get update"

我想知道是否有像此功能一样的内置命令,或者类似的东西可以从存储库安装?

答案1

没有内置 bash 命令来添加永久别名。此类别名是通过将它们添加到由交互式 shell 提供的配置文件中来创建的,就像您对 所做的那样.bashrc

但是,您可以考虑修改您的palias()实现,将别名放在单独的文件中。我认为这可以算是一种改进,原因有六个:

  1. 可以将主要自动编辑的文件与主要手动编辑的文件分开。如果您出于好奇或为了调查问题而需要查看发生了什么,这种分离可能会有所帮助。(或者如果该函数被意外调用多次,从而创建了大量不必要的行,则损害将更加有限。)

  2. 通过将单独的、自动生成的别名定义放在其他地方.bashrc,您可以创建一个“在幕后工作”的系统,这通常是人们在寻找专用的内置函数来执行任务时想要的。

  3. .bashrc通常已经相当复杂了。如果代码中没有充斥着大量用户定义的自动附加别名,那么阅读和修改不相关的内容会更加容易。

  4. 简单的实现palias()(包括您编写的内容和我将要推荐的内容)如果要附加到的文件尚未以换行符结尾(或为空白),则会产生错误的行。通常,文本编辑器会为您执行此操作,但可能会意外地以没有换行符的方式结束文本文件,在这种情况下palias()将创建一个可能正确也可能不正确的混杂行,无论哪种方式都非常难以阅读。通过将别名放在您很少或至少不太频繁手动编辑的单独文件中,您可以降低这种风险。

  5. 如果您扩展palias()实现以读取其目标文件的现有内容(例如,给出有用的警告),那么如果可以假设它完全由别名定义组成,那么这样做可能会容易得多。(或者,对于更复杂的解析:完全由别名定义和假定为错误的行组成。)

  6. 人们已经普遍建议(尽管不可否认这并不是任何强烈的警告)将新的别名放在单独的文件中:.bash_aliases

    如何创建永久的 Bash 别名?有关放置别名的位置的更多信息。

Ubuntu 中的默认.bashrc文件包含以下代码:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

因此,如果您创建.bash_aliases,它将被使用。定义该函数的命令palias()可以是:

palias() { echo "alias $1='$2'" >> ~/.bash_aliases; }

该命令仍应进入.bashrc,但它创建的别名将被放置在中.bash_aliases

更复杂的实现也是可能的。你可以:

  1. 运行定义并添加它,以便可以立即使用。建议在osirisgothra 的回答我会用:

    palias() { echo "alias $1='$2'" >> ~/.bash_aliases; alias "$1=$2"; }
    
  2. 检查以确保.bash_aliases不存在、为空或以换行符终止,如果它非空但不以换行符终止,则在别名定义之前附加换行符。

    palias() {
        local target=~/.bash_aliases
        [[ -f "$target" && -n $(tail -c1 "$target") ]] && echo >> "$target"
        echo "alias $1='$2'" >> "$target"
    }
    

    Gilles 的回答在多个文件中添加缺失的换行符有关使用 检测丢失的换行符的详细信息tail

  3. 检查并警告有关定义已在 中定义的别名.bash_aliases

    普鲁托克斯提出了这个想法。但是我不建议使用grep $1 ~/.bash_aliases或类似的,因为它会产生频繁的误报,随时$1匹配另一个别名定义的任何部分,并且偶尔会产生误报。问题进一步复杂化,因为一些有效的 bash 别名(作为正则表达式)匹配的不仅仅是它们自己——+实际上.用于命令和别名——而一些甚至不匹配它们自己。
    grep "alias $1="更好但只能部分缓解问题。^模式中的前导几乎只匹配定义的前导,但不能解决 中的正则表达式元字符的问题,而使用会剥夺所有元字符的特殊含义,但这样做会阻止使用。alias name$1grep -F^

    grep这种方式.bashrc甚至比更糟糕.bash_aliases,因为该文件中可能包含无限多种文本,大多数外部任何别名定义。

    如果您想检查当前 shell 中定义的别名,无论它们是否写入.bash_aliases(或任何地方),您都可以使用alias "$1"(或alias不带参数运行并仔细匹配其输出)。这个想法归功于 muru。它确实有一个缺点,如果你用定义一个别名来alias测试它,然后用使其成为永久的palias,你会收到一个警告,即使它还不是永久的,一切都很好。

    要根据的内容检查新的永久别名.bash_aliases,您可以执行以下操作:

    palias() {
        local target=~/.bash_aliases
    
        if grep -Pqs '^[ \t]*alias[ \t]+\Q'"$1"'\E\=' "$target"; then
            printf "%s: %s: warning: defining \`%s' again in %s\n" \
                        "$0" "$FUNCNAME" "$1" "$target" >&2
        fi
    
        echo "alias $1='$2'" >> "$target"
    }
    

    这似乎很有效,但我怀疑还有更优雅的方法。([ \t]*如果你把前面的空格alias当作是多行别名定义的一部分,那么可以说应该删除。)如果\E出现在 中$1,它将发生故障,但 shell 元字符和引号字符(如)\在别名中无效,因此您无需将其作为输入。
    理想情况下,对于任何错误输入,您调用的任何面向用户的函数都不会执行任何操作,除了打印有用的错误消息。但就其性质而言palias(),除非您准备使其定义更加复杂(见下文),否则合理输入的负担已经主要落在用户身上。您可以使用此函数编写非别名和别名定义语法错误.bash_aliases,虽然考虑到您将使用的方式,这可能是可以接受的,但相比之下palias(),阻塞是微不足道的。\E

    更严重的是,alias name1='def1' name2='def2' ...这对于命令来说是非常好的语法alias,但我还没有尝试解析作为aliasin的后续参数给出的别名定义.bash_aliases,因为我相信正确确定第一个非引用空格出现的位置并不是一件容易的事。

    因此,如果您使用上述palias()实现,并且有时在.bash_aliases(或您用作 的任何文件$target) 中手动定义别名,那么alias ...如果您想获得可靠的警告行为,则每行只应定义一个别名。
    它也无法识别位于 或其他连接词右侧的别名定义;,例如alias在同一行上链接单独的命令,但您似乎不太可能希望在 中这样做.bash_aliases

  4. 进行解析$1以确保它是别名的有效名称。

  5. 解析$2以尝试确定它是否是别名的合理主体,如果不是,则发出警告、失败或(在适用的情况下)正确引用它。例如,如果字符'出现在中会发生什么$2

  6. 做一个更简单的版本,只是检查 并'寻址$2

你可能不想理会这些。您知道函数的工作原理、局限性以及如何正确使用它。我看到了四个既合理又简单的选项:

  1. 继续使用你现在已有的东西即可。
  2. 使用如上所述的实现,将别名放入.bash_aliases而不是.bashrc
  3. 为自动添加的别名制作第三个文件,并单独获取该文件(在.bashrc或中) .bash_alises
  4. palias()根本不使用函数,只需通过编辑.bash_aliases或手动添加别名.bashrc

答案2

我建议(当然你不eval "$_") 在命令后面放置一个echo,这样别名就会立即添加,并且grep -Pq "alias $1" && return在开头放置一个,以确保(1)您没有重复的别名,(2)别名会立即定义,而不是等待它们被重新获取。

如果您想要更具创造力(这就是我的做法),还允许它从您的历史记录中获取一个数字,并将其定义为别名,或者按顺序分配给一个别名或多个别名的一组数字,等等。

多年来,我已经在自己的 .bashrc 上投入了大量精力——我确实在一个名为 gxbase 的项目下分享了它,但由于它是“我的偏好”,所以很可能不是“其他人”想要的。配置设置是非常个人的事情。大多数人都希望事情看起来像/etc/skel/.bashrc,如果你设置了太多的自定义选项,bash 完成之类的东西就会停止工作 :) 不过只是为了好玩,我的链接是http://gitorious.org/gxbase。文件在extras/my.bashrc/*(如果感兴趣的话请参阅底部的 PS)。

至于你的问题,许多有些人发布了他们所谓的“终极 .bashrc 设置”,但遗憾的是,这些设置仅适用于他们,我的回答是:如果你自己创建这个文件,你会最幸福,相信我,出于对所有神圣事物的热爱;制作[离线]备份!!!:) 如果您想更具创造力,那么“硬(印刷)副本”是进一步规划的好方法!


PS:.bashrc-git 的内容是从 gitsh 项目分叉而来的,因此大部分功劳都归功于那个人,而 perlconsole 和 aptsh 集成也不是我的(全部)。您必须安装经过修改的 perlconsole 和 aptsh 文件才能将其完全集成到虚拟目录中。

相关内容