Аргументи командного рядка підлягають інтерпретації командною оболонкою системи, змінюючи поведінку команди або змінюючи значення аргументів до того, як вони будуть передані в викликану програму.
Коли аргумент (наприклад, значення для --password
) містить символ, який може інтерпретувати оболонка, їх потрібно або цитувати (як правило, укладені в єдині лапки)'
в unix, або подвійну лапочку "
в Windows) або уникати окремо (зазвичай із зворотною косою рисою \
перед кожним метахарактером ) щоб уникнути тлумачення оболонкою.
Хоча конкретні символи характерні для системи, деякі символи, на які слід стежити, включають:
$ & ! \ [ ] < > `
Якщо пароль, для справді поганого прикладу, був встановлений 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
Подальше читання:
Оновлення: щоб уникнути '
одноразових або "
подвійних лапок у паролі, ви можете уникнути їх за допомогою зворотної косої риси або докласти весь аргумент у протилежному стилі цитат, якщо немає інших символів, які обраний стиль цитування не сумісний з.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Якщо у вас є також одна цитата та інші спеціальні символи, ви застрягли у втечі зворотної косої риси, тому що, в unix, подвійна цитата є "слабкішою", ніж одна цитата, і багато метахарактерів все ще розширюються, коли додаються до подвійних лапок, але не одиничні цитати.
Це не специфічно для MySQL, але стосується будь-якого аргументу командного рядка.
Зазвичай за допомогою echo
команди можна побачити, як оболонка інтерпретує ваші аргументи.
$ 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
Наступні дії: оболонка bash (і, мабуть, деякі інші) дозволяє уникати одинарних лапок у рядках з одним цитуванням, хоча конвенція є химерною (ймовірно, заснованою на деякому давно забутому рішенні, втраченому зараз у туманах часу):
Замініть кожну '
внутрішню рядок на, '\''
перш ніж загортати всю рядок в одиничні лапки ... так буквальна рядок foo'bar
виражається як 'foo'\''bar'
.
Як я вже казав, химерні. Це потрібно, тому що косої косий рядок виходить з однієї цитати поза однієї рядком, котирується, зворотній косої риски не уникне нічого в межах рядка з одним котируванням у bash, а окремі рядки, що цитуються, можуть бути закриті та повторно відкриті декількома одиничними цитатами до тих пір, поки не буде відмінено втручаються персонажі, які мають особливе значення. Таким чином, '\''
закривається цитування рядка, потім постачається відмічений літерал, а потім знову відкривається цитування рядка.