创建permanent-alias bash命令

时间:2017-04-10 08:59:30

标签: linux bash sh alias

我正在努力创造一个" permalias" bash命令能够轻松创建永久别名,而无需直接处理〜/ .bashrc文件。

截至目前,我能够完成这项工作的唯一方法是使用此代码:

alias permalias="echo alias $1 >> ~/.bashrc"

允许以这种格式输入:

permalias commandname=\"commandbody\"

但我对此并不满意,因为我想保留一个更简单的输入格式,更接近原始别名命令。

我试过这个代码的几个变体:

alias permalias="echo alias $1=\"$2\" >> ~/.bashrc"

使用此版本,此代码permalias c "echo test"应将此行alias permalias c="echo test"添加到〜/ .bashrc文件中。

但结果是:alias c "echo test",当然,这不起作用。

我也很感激有关如何避免使用"围绕新命令的身体。

谢谢

3 个答案:

答案 0 :(得分:0)

您无法在alias中使用参数。你需要的是一个功能,如:

permalias() {
    echo "alias ${1}=\"${2}\"" >> ~/.bashrc
}

答案 1 :(得分:0)

使其成为Olli所说的函数,然后你可以使用"$*"来连接函数的所有参数。

permalias() { 
    n=$1; 
    shift; 
    echo "alias $n=\"$*\"" >> ~/.bashrc; 
}

这应该适用于像permalias c echo foo bar这样的内容,但是如果你真的想在里面引用别名,它就会变得毛茸茸。 permalias c echo "foo bar"不起作用,您需要permalias c echo "'foo bar'"之类的东西来抵消额外的命令行处理级别并获取文件的内部引号。

对于任何复杂的事情,最好还是制作一个shell函数。您可以使用declare -fp funcname打印函数的定义,并根据需要将其保存到文件中。

答案 2 :(得分:0)

试试这个:

#!/bin/bash
permalias()
{
  local alias_regex='[A-Za-z_0-9]*'
  if
    [[ $# = 1 && $1 =~ ($alias_regex)=(.*) ]]
  then
    printf "%s\n" "${BASH_REMATCH[1]}=\"${BASH_REMATCH[2]}\"" >> ~/.bashrc
  else
    echo "USAGE: permalias VARNAME=ALIAS_COMMAND"
    return 1
  fi
}

更好的版本会首先检查.bashrc中是否存在所述别名,然后将其替换或失败(如果已存在)。