2017-07-29 3 views
1

Je ces deux commandes qui fonctionnent:commande ne fonctionne pas comme alias

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

ils peuvent grep pass2 d'un .my.cnf comme celui-ci:

# 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 

Mais si je les fais comme alias:

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" 

l'une perl retourne

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

et le rendement variant awk

password=pass1 # comment 
password=pass2 # comment 

Pourquoi est le résultat si différent alias? Lorsque j'utilise les commandes directement dans la coquille, je reçois juste pass2

+0

Conseil: '-00' devrait être' -0777'. Le premier ne fait pas de slurp; ce dernier fait. – ikegami

Répondre

1

Vous devez échapper à la $ parce $1 est interprété par le shell:

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

Ou utilisez des guillemets simples, en remplaçant les guillemets simples intégrés qui valent «\» – ikegami

4

alias sont pour de simples commandes comme alias lf='ls -F', pour quoi que ce soit plus compliqué, vous devez utiliser les fonctions:

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

Tous les coquilles prennent en charge des traits d'union en fonction ou alias les noms BTW ils sont donc mieux éviter pour la portabilité - voir https://unix.stackexchange.com/questions/168221/are-there-problems-with-hyphens-in-functions-aliases-and-executables