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 echo
polecenia, 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'bar
jest 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.