Аргументы командной строки могут интерпретироваться системной командной оболочкой, изменяя поведение команды или изменяя значение аргументов перед их передачей в вызываемую программу.
Когда аргумент (например, значение для --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, а строки с одинарными кавычками могут закрываться и открываться несколькими одинарными кавычками, если нет неоткрытых строк. промежуточные символы, которые имеют особое значение. Поэтому '\''
закрывает цитирование строки, затем предоставляет экранированный литерал, а затем снова открывает цитирование строки.