Argumenty wiersza poleceń podlegają interpretacji przez systemową powłokę poleceń, zmieniając zachowanie polecenia lub zmieniając wartość argumentów przed przekazaniem ich do wywoływanego programu.
Gdy argument (taki jak wartość dla --password) zawiera znak, który powłoka może interpretować, należy go albo zacytować (zwykle ująć w pojedyncze cudzysłowy w systemie 'Unix lub podwójny cudzysłów "w systemie Windows), albo uciec indywidualnie (zwykle odwrotnym ukośnikiem \przed każdym metaznakiem ), aby uniknąć interpretacji przez powłokę.
Podczas gdy określone znaki są specyficzne dla systemu, niektóre znaki, na które należy uważać, obejmują:
$ & ! \ [ ] < > `
Jeśli hasło, na naprawdę zły przykład, zostało ustawione na 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
Dalsza lektura:
Aktualizacja: aby uciec 'pojedynczemu lub "podwójnemu cudzysłowowi w haśle, możesz uciec przed nimi ukośnikiem odwrotnym lub umieścić cały argument w odwrotnym stylu cudzysłowów, jeśli nie ma innych znaków, których wybrany styl cytowania nie jest zgodny z.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Jeśli masz pojedynczy cytat, a także inne znaki specjalne, utkniesz z ukośnikiem odwrotnym, ponieważ w systemie uniksowym podwójny cytat jest „słabszy” niż pojedynczy cytat, a wiele metaznaków jest nadal rozwiniętych, gdy jest ujętych w podwójny cudzysłów, ale nie w pojedyncze cytaty.
Nie jest to specyficzne dla MySQL, ale dotyczy wszystkiego z argumentami wiersza poleceń.
Zazwyczaj możesz użyć tego echopolecenia, aby zobaczyć, jak powłoka interpretuje twoje argumenty.
$ 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
Dalsze działania: Powłoka bash (i przypuszczalnie niektóre inne) pozwala na unikanie pojedynczych cudzysłowów w ciągach pojedynczych cudzysłowów, chociaż konwencja jest dziwna (prawdopodobnie oparta na dawno zapomnianej decyzji zagubionej w mgiełce czasu):
Zastąp każdy 'z nich '\''przed owijaniem całego łańcucha pojedynczymi cudzysłowami ... więc literał foo'barjest wyrażony jako 'foo'\''bar'.
Jak powiedziałem, dziwne. Jest to konieczne, ponieważ ukośnik odwrotny unika pojedynczego cudzysłowu poza ciągiem pojedynczego cudzysłowu, odwrotny ukośnik nic nie unika w bash ciągu pojedynczego cudzysłowu, a ciągi pojedynczego cudzysłowu można zamykać i ponownie otwierać za pomocą wielu pojedynczych cudzysłowów, o ile nie ma nieokreślonego interweniujące postacie o specjalnym znaczeniu. Tak więc '\''zamyka cytowanie łańcucha, a następnie podaje znak ucieczki, a następnie ponownie otwiera cytowanie łańcucha.