Argumen baris perintah tunduk pada interpretasi oleh shell perintah sistem, mengubah perilaku perintah atau mengubah nilai argumen sebelum diteruskan ke program yang disebut.
Ketika argumen (seperti nilai untuk --password
) berisi karakter yang dapat ditafsirkan oleh shell, mereka perlu dikutip (biasanya dilampirkan dalam tanda kutip tunggal '
dalam unix atau penawaran ganda "
di Windows) atau melarikan diri secara individual (biasanya dengan backslash \
sebelum setiap metacharacter) ) untuk menghindari interpretasi oleh shell.
Sementara karakter spesifik adalah sistem khusus, beberapa karakter yang harus diperhatikan termasuk:
$ & ! \ [ ] < > `
Jika kata sandi, untuk contoh yang sangat buruk, disetel ke 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
Bacaan lebih lanjut:
Pembaruan: untuk keluar dari tanda kutip '
tunggal atau "
ganda dalam kata sandi, Anda dapat menghindarinya dengan backslash terkemuka, atau melampirkan seluruh argumen dalam gaya kutipan yang berlawanan jika tidak ada karakter lain yang tidak sesuai dengan gaya kutipan yang dipilih. dengan.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Jika Anda memiliki kutipan tunggal dan karakter khusus lainnya juga, Anda terjebak dengan garis miring terbalik karena, dalam unix, kutipan ganda itu "lebih lemah" daripada kutipan tunggal dan banyak metakarakter masih diperluas ketika diapit dengan tanda kutip ganda tetapi tidak tunggal tanda kutip.
Ini bukan khusus MySQL tetapi berlaku untuk apa pun dengan argumen baris perintah.
Anda biasanya dapat menggunakan echo
perintah untuk melihat bagaimana shell menafsirkan argumen Anda.
$ 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
Tindak lanjut: Bash shell (dan mungkin beberapa yang lain) memungkinkan lolosnya tanda kutip tunggal dalam string yang dikutip satu kali, meskipun konvensi ini aneh (mungkin didasarkan pada beberapa keputusan yang sudah lama terlupakan yang hilang sekarang akibat kabut waktu):
Ganti setiap '
bagian dalam string dengan '\''
sebelum membungkus seluruh string dalam tanda kutip tunggal ... sehingga string literal foo'bar
dinyatakan sebagai 'foo'\''bar'
.
Seperti yang saya katakan, aneh. Ini diperlukan karena backslash lolos dari kuotasi tunggal di luar string yang dikutip tunggal, backslash lolos dari apa pun di dalam string yang dikutip tunggal dalam bash, dan string yang dikutip tunggal dapat ditutup dan dibuka kembali dengan beberapa kutipan tunggal selama tidak ada yang tidak terhindar. karakter campur tangan yang memiliki makna khusus. Jadi '\''
tutup kutipan string, lalu sajikan literal yang lolos, lalu buka kembali kutipan string.