如何动态更新.bashrc文件中的别名?

时间:2016-05-21 00:20:33

标签: bash shell

我在部门.bashrc文件中定义了一个别名,该文件来自单个用户.bashrc文件。在单个用户.bashrc文件中,我希望能够向现有别名添加选项。例如,在第一个(部门).bashrc文件中,我有以下内容:

alias my_command = '/usr/local/bin/my_command -option1 -option2'

在用户.bashrc文件中,我想在现有别名的基础上构建,例如

alias my_command = 'my_command -option3'

如上所述,用户.bashrc文件中的别名指令只会替换部门.bashrc文件中定义的同名别名。我尝试用以下方法解决这个问题:

existing_alias_components=($(type my_command))

在数组的前四个元素中返回单词my_command,is,aliased和to。我想捕获剩余的数组元素,将它们连接回一个字符串 - 比如$string - 然后发出命令

alias my_command="$string -option 3"

我遇到了挑战,因为围绕别名的第一个定义的引号字符进入前四个之后的第一个和最后一个数组值。我可以将它们排除在外,但是对于perl中的单行程来说,它的工作量很大。有没有更方便的方法来实现这一目标?

谢谢!

2 个答案:

答案 0 :(得分:2)

考虑使用函数。例如:

my_command_args=( -option1 -option2 )
my_command() {
  command my_command "${my_command_args[@]}" "$@"
}

...之后有人可以跑:

# add a 3rd option on the end:
my_command_args+=( -option-3 )

...或者,添加一个新参数:

# add a 0th option on the beginning
my_command_args=( -option0 "${my_command_args[@]}" )

这里的一大优势是您可以将数据附加到别名,而无需安全地引用它。例如,以下是别名的坏消息:

# This is evil
bad_string='$(rm -rf /tmp)'
alias my_command="$oldalias --fail-if-command-contains=$bad_string"

...需要通过printf '%q'

之类的方式运行
# ...can make it safer this way, if using an alias
bad_string='$(rm -rf /tmp)'
printf -v bad_string_safe %q "$bad_string"
alias my_command="$oldalias --fail-if-command-contains=$bad_string_safe"

...但如果使用功能配方,如果没有这一步,那将是绝对安全的:

# This is safe
bad_string='$(rm -rf /tmp)'
my_command_args+=( --fail-if-command-contains="$bad_string" )

答案 1 :(得分:1)

我只需从单引号中提取别名值:

 oldalias=$(alias my_command|sed "s/^[^']*'//; s/'$//"); 

然后再做

 alias my_command="$oldalias -option 3"