命令不能用作别名

时间:2017-07-29 15:22:23

标签: mysql shell perl awk alias

我有两个有效的命令:

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

他们可以从.my.cnf grep pass2这样:

# 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 个答案:

答案 0 :(得分:4)

别名适用于alias lf='ls -F'之类的简单命令,对于任何更复杂的命令,你应该使用函数:

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

并非所有shell都支持函数或别名中的连字符btw,因此最好避免它们的可移植性 - 请参阅https://unix.stackexchange.com/questions/168221/are-there-problems-with-hyphens-in-functions-aliases-and-executables

答案 1 :(得分:1)

您必须转义$因为$1由shell解释:

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