【问题标题】:Creating permanent-alias bash command创建永久别名 bash 命令
【发布时间】:2017-09-05 05:52:22
【问题描述】:

我正在尝试创建一个“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",当然,这不起作用。

对于如何避免将 " 放在新命令的主体周围的任何建议,我也将不胜感激。

谢谢

【问题讨论】:

    标签: linux bash sh alias


    【解决方案1】:

    您不能在 alias 中使用参数。你需要的是一个函数,比如:

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

    【讨论】:

    • 试过了,结果是一样的。 = 未写入文件中。另外,参数编号周围的 { } 是什么意思?
    【解决方案2】:

    按照 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 打印函数的定义,并根据需要将其保存到文件中。

    【讨论】:

      【解决方案3】:

      试试这个:

      #!/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 中是否存在所述别名,然后替换它,如果它已经存在则失败。

      【讨论】:

      【解决方案4】:

      如果你碰巧使用 zsh,借鉴 Fred 的 answer,我们可以将 $BASH-REMATCH 切换为 $match 并将别名发送到 .zsh_aliases(假设你已经设置了它们——如果没有将 .zsh_aliases 添加到你的homedir 并将其添加到您的 .zshrc:source ~/.zsh_aliases)。

      因此,作为示例,我将此函数添加到我的 .zsh_aliases 文件中,它运行良好。

       permalias() {
          sauce="unhash -ma "*" ; unhash -mf "*"; source ~/.zshrc"
          local alias_regex='[A-Za-z_0-9]*'
          if
              [[ $# == 1 && $1 =~ ($alias_regex)=(.*) ]]
          then
              printf "%s\n" "alias ${match[1]}=\"${match[2]}\"" >>~/.zsh_aliases
              #uncomment the following line to automatically load your new alias
              #eval ${sauce}
          else
              echo "Usage: permalias ALIAS_NAME=ALIAS_COMMAND"
              return 1
          fi
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-05
        • 2014-09-14
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多