Ars*_*nux 5 command-line bash alias bashrc
我到处搜索,几乎每个人都建议打开~/.bashrcor ~/.bash_aliases,然后将别名命令放在那里,我创建了一个函数名palias作为永久别名函数并将其放入~/.bashrc:
function palias(){ echo "alias $1='$2'" >> /home/User/.bashrc;}
Run Code Online (Sandbox Code Playgroud)
所以现在如果我想永久别名一些命令,我只是:
palias update "sudo apt-get update"
Run Code Online (Sandbox Code Playgroud)
我想知道是否有像这个函数这样的内置命令,或者像这样的东西可以从存储库安装?
没有内置的 bash 来添加永久别名。此类别名是通过将它们添加到由交互式 shell 提供的配置文件中来创建的,就像您对.bashrc.
但是您可能会考虑修改您的palias()实现,将别名放入单独的文件中。我认为这可以被视为一种改进,原因有六个:
主要自动编辑的文件可以与主要手动编辑的文件分开。如果你需要看看发生了什么——出于好奇,或者调查一个问题——这种分离可能会有所帮助。(或者,如果该函数被意外调用多次,从而创建大量不必要的行,则损害会稍微受到控制。)
通过将单独的、自动生成的别名定义放在除 之外的其他位置.bashrc,您可以创建一个“在幕后工作”的系统,这通常是人们在寻找专用内置函数来执行任务时所需要的。
.bashrc通常已经相当复杂了。如果它没有填充许多用户定义的自动附加别名,那么出于不相关的目的而阅读和修改会更容易。
palias()如果它们附加到的文件尚未以换行符终止(或空白),那么简单的实现(包括您所写的内容和我将要推荐的内容)将创建错误的行。通常,文本编辑器会为您执行此操作,但可能会意外地在没有换行符的情况下结束文本文件,在这种情况下,palias()将创建一个可能正确也可能不正确的混合行,并且无论哪种方式都很难阅读。通过将别名放入很少或至少不频繁手动编辑的单独文件中,可以降低这种风险。
如果您曾经扩展palias()实现来读取其目标文件的现有内容(例如,给出有用的警告),那么如果可以假设完全由别名定义组成,那么这样做可能会容易得多。(或者,对于更复杂的解析:完全由别名定义和假定错误的行组成。)
人们已经广泛建议(尽管诚然不是任何强烈的警告)将新别名放在单独的文件中:.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
Run Code Online (Sandbox Code Playgroud)
因此,如果您创建.bash_aliases,它将被使用。定义函数的命令palias()可以是:
palias() { echo "alias $1='$2'" >> ~/.bash_aliases; }
Run Code Online (Sandbox Code Playgroud)
该命令仍应输入.bashrc,但它创建的别名将放置在.bash_aliases.
更复杂的实现是可能的。你可以:
运行定义并添加它,这样它就可以立即使用。osirisgothra 的回答中建议了这一点。我会用:
palias() { echo "alias $1='$2'" >> ~/.bash_aliases; alias "$1=$2"; }
Run Code Online (Sandbox Code Playgroud)检查以确保.bash_aliases不存在、为空或以换行符终止,如果它非空但不是以换行符终止,则在别名定义之前附加换行符。
palias() {
local target=~/.bash_aliases
[[ -f "$target" && -n $(tail -c1 "$target") ]] && echo >> "$target"
echo "alias $1='$2'" >> "$target"
}
Run Code Online (Sandbox Code Playgroud)
有关使用 检测缺失换行符的详细信息,请参阅Gilles对在多个文件中添加缺失tail换行符的回答。
检查并警告定义已在 中定义的别名.bash_aliases。
Ploutox 提出了这个想法。但我不建议使用grep $1 ~/.bash_aliases或类似,因为它会产生频繁的误报,任何时候$1都会匹配另一个别名定义的任何部分,并且偶尔会产生误报。问题变得更加复杂,因为一些有效的 bash 别名(被视为正则表达式)如何比它们本身更匹配——+并且.实际上在命令和别名中使用——还有一些甚至它们本身也不匹配。
grep "alias $1="更好,但只能部分缓解问题。模式中的前导^可以很好地仅匹配定义的前导,但不能解决 中的正则表达式元字符的问题,而 using会剥夺所有元字符的特殊含义,但这样做会阻止使用。alias name$1grep -F^
grep这种.bashrc方式甚至比 更糟糕.bash_aliases,因为该文件中可能包含无限种文本,大部分都在任何别名定义之外。
如果您想检查当前 shell 中定义的别名,无论它们是否写入.bash_aliases(或任何地方),您可以使用alias "$1"(或alias不带参数运行并仔细匹配其输出)。这个想法要归功于穆鲁。它确实有一个缺点,如果您定义一个别名来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"
}
Run Code Online (Sandbox Code Playgroud)
这似乎很有效,尽管我怀疑还有更优雅的方法。(如果您之前将前导空格作为多行别名定义的一部分,那么可以说[ \t]*应该将其删除。)如果出现在 中,它将发生故障,但 shell 元字符和引用字符在别名中无效,因此您不需要将其作为输入。理想情况下,对于任何错误的输入,您调用的任何面向用户的函数除了打印有用的错误消息之外不会执行任何操作。但根据 的性质,至少除非您准备使其定义更加复杂(见下文),否则合理输入的负担已经主要落在用户身上。您可以使用此函数编写非别名和别名定义语法错误,虽然考虑到您将使用的方式,这可能是可以接受的,但相比之下,窒息是次要的。alias\E$1\
palias().bash_aliasespalias()\E
更严重的是,alias name1='def1' name2='def2' ...该alias命令的语法非常好,但我没有尝试解析作为aliasin后续参数给出的别名定义.bash_aliases,因为我相信正确确定第一个未引用空白出现的位置将是不平凡的。
因此,如果您使用上述palias()实现,并且有时还手动在.bash_aliases(或您使用的任何文件)中定义别名,那么如果您希望获得可靠的警告行为,则$target应该每行只定义一个别名。它还无法识别 a 或其他连接词右侧的别名定义,例如在同一行上链接单独的命令,但您似乎不太可能希望在.alias ...
;alias.bash_aliases
解析$1以确保它是别名的有效名称。
解析$2以尝试确定它是否是别名的合理主体,如果不是,则发出警告、失败或(如果适用)正确引用它。例如,如果一个'字符出现在 中会发生什么$2?
相反,做一个更简单的版本,只需检查并'寻址$2.
但您可能不想为这些烦恼。您知道您的函数如何工作、其局限性以及如何正确使用它。我为您找到了四个既相当不错又非常简单的选择:
.bash_aliases而不是.bashrc..bashrc或.bash_alises.palias()根本不使用函数,只需通过编辑.bash_aliases或手动添加别名即可.bashrc。| 归档时间: |
|
| 查看次数: |
2010 次 |
| 最近记录: |