Os argumentos da linha de comando estão sujeitos a interpretação pelo shell de comando do sistema, alterando o comportamento do comando ou alterando o valor dos argumentos antes de serem passados para o programa chamado.
Quando um argumento (como o valor de --password
) contém um caractere que o shell pode interpretar, ele precisa ser citado (geralmente entre aspas simples '
no unix ou aspas duplas "
no Windows) ou ser escapado individualmente (geralmente com uma barra invertida \
antes de cada metacaractere ) para evitar a interpretação do shell.
Embora os caracteres específicos sejam específicos do sistema, alguns caracteres a serem observados incluem:
$ & ! \ [ ] < > `
Se a senha, para um péssimo exemplo, estiver definida como pa$$word
...
mysql --password=pa$$word # does not work
mysql --password='pa$$word' # works
mysql --password=pa\$\$word # works, but slightly unclear what's going on at first glance
Leitura adicional:
Atualização: para escapar de aspas '
simples ou "
duplas na senha, você pode escapá-las com uma barra invertida à esquerda ou colocar todo o argumento no estilo oposto de aspas, se não houver outros caracteres que o estilo de citação escolhido não seja compatível com.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Se você possui uma citação simples e outros caracteres especiais, está com a barra invertida escapando porque, no unix, a citação dupla é "mais fraca" do que uma citação única e muitos metacaracteres ainda são expandidos quando colocados entre aspas duplas, mas não individuais. citações.
Isso não é específico do MySQL, mas se aplica a qualquer coisa com argumentos de linha de comando.
Normalmente, você pode usar o echo
comando para ver como o shell está interpretando seus argumentos.
$ echo foo$bar
foo # literal 'foo' plus the (empty) shell variable $bar
$ echo foo\$bar
foo$bar # backslash prevents expansion of $bar as a variable
$ echo "foo$$bar" # weaker double quote doesn't prevent expansion so
foo9691bar # the $$ expands to the unix process id (pid) of the current shell
$ echo 'foo$$bar'
foo$$bar # "stronger" single quote prevents shell expansion
$ echo "foo'bar"
foo'bar # double quote allows single quote within the literal
Acompanhamento: O shell bash (e presumivelmente alguns outros) permite escapar aspas simples dentro de strings de aspas simples, embora a convenção seja bizarra (provavelmente baseada em alguma decisão esquecida perdida agora para as brumas do tempo):
Substitua cada um '
dentro da cadeia por '\''
antes de agrupar a cadeia inteira entre aspas simples ... para que a cadeia literal foo'bar
seja expressa como 'foo'\''bar'
.
Como eu disse, bizarro. Isso é necessário porque uma barra invertida escapa uma citação única fora de uma única cadeia de caracteres entre aspas, uma barra invertida não escapa nada dentro de uma cadeia de caracteres entre aspas simples no bash e as cadeias de caracteres entre aspas simples podem ser fechadas e reabertas por várias aspas simples, desde que não haja escape caracteres intervenientes com significado especial. Então '\''
fecha a citação da sequência, fornece o literal escapado e reabre a citação da sequência.