代码之家  ›  专栏  ›  技术社区  ›  Asara

命令不能用作别名

  •  1
  • Asara  · 技术社区  · 7 年前

    我有两个有效的命令:

    awk -F'[= ]' '/^password=/ && p !~ /clientreadonly/{print $2} {p=$0}' ~/.my.cnf
    perl -00 -ane '/\[client\].password=(\S+)/s && print $1' < ~/.my.cnf
    

    他们可以从a.my。cnf如下:

    # longer
    # comment text
    
    [clientreadonly]
    password=pass1 # comment
    port=3306
    user=test_ro
    socket=/var/lib/mysql/mysql.sock
    
    [client]
    password=pass2 # comment
    port=3306
    user=test
    socket=/var/lib/mysql/mysql.sock
    

    但如果我把它们作为别名:

    alias mysql-get-password="perl -00 -ane '/\[client\].password=(\S+)/s && print $1' < ~/.my.cnf"
    alias mysql-get-password2="awk -F'[= ]' '/^password=/ && p !~ /clientreadonly/{print $2} {p=$0}' ~/.my.cnf"
    

    perl返回

    [client]
    password=pass2 # comment
    port=3306
    user=test
    socket=/var/lib/mysql/mysql.sock
    

    awk变量返回

    password=pass1 # comment
    password=pass2 # comment
    

    为什么结果与别名如此不同?当我在shell中直接使用这些命令时,我只需要 pass2

    2 回复  |  直到 7 年前
        1
  •  4
  •   Ed Morton    7 年前

    别名用于简单的命令,如 alias lf='ls -F' ,对于更复杂的内容,应使用函数:

    function mysql_get_password2 {
        awk -F'[= ]' '/^password=/ && p !~ /clientreadonly/{print $2} {p=$0}' ~/.my.cnf
    }
    

    顺便说一句,并非所有shell都支持函数名或别名中的连字符,因此为了便于移植,最好避免使用连字符-请参阅 https://unix.stackexchange.com/questions/168221/are-there-problems-with-hyphens-in-functions-aliases-and-executables

        2
  •  1
  •   Toto    7 年前

    你必须逃离 $ 因为 $1

    alias mysql-get-password="perl -00 -ane '/\[client\].password=(\S+)/s && print \$1' < ~/.my.cnf"
    #                                                                      here ___^