อาร์กิวเมนต์บรรทัดคำสั่งขึ้นอยู่กับการตีความโดยเชลล์คำสั่งของระบบการเปลี่ยนพฤติกรรมของคำสั่งหรือการเปลี่ยนแปลงค่าของข้อโต้แย้งก่อนที่พวกเขาจะถูกส่งผ่านเข้าไปในโปรแกรมที่เรียกว่า
เมื่ออาร์กิวเมนต์ (เช่นค่าสำหรับ--password
) มีอักขระที่เชลล์อาจตีความพวกเขาจะต้องยกมา (มักจะอยู่ในเครื่องหมายคำพูดเดียว'
ในยูนิกซ์หรืออัญประกาศคู่"
ใน Windows) หรือหนีเป็นรายบุคคล (มักจะมีเครื่องหมายทับขวา\
ก่อนแต่ละ metacharacter ) เพื่อหลีกเลี่ยงการตีความโดยเชลล์
ในขณะที่อักขระเฉพาะเป็นระบบเฉพาะอักขระบางตัวที่ต้องระวัง ได้แก่ :
$ & ! \ [ ] < > `
หากรหัสผ่านสำหรับตัวอย่างที่ไม่ดีจริง ๆ ถูกตั้งเป็น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
หากคุณมีเครื่องหมายคำพูดเดี่ยวและอักขระพิเศษอื่น ๆ เช่นกันคุณกำลังติดกับเครื่องหมายแบ็กสแลชหนีเนื่องจากในยูนิกซ์เครื่องหมายคำพูดคู่คือ "อ่อนแอ" กว่าเครื่องหมายคำพูดเดี่ยวและอักขระเมตาหลายตัวยังคงขยายเมื่ออยู่ในเครื่องหมายคำพูดคู่ คำพูด
นี่ไม่ใช่ 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
การติดตามผล: เชลล์ทุบตี (และบางคนอาจสันนิษฐานได้) อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยวภายในสตริงที่ยกมาเดี่ยวแม้ว่าการประชุมจะแปลกประหลาด (อาจขึ้นอยู่กับการตัดสินใจที่ลืมไปนานบางส่วนที่หายไปจากหมอกแห่งกาลเวลา)
แทนที่แต่ละ'
ภายในสตริงที่มี'\''
ก่อนที่จะตัดสตริงทั้งหมดในราคาเดียว ... ดังนั้นสายอักขระตัวอักษรจะแสดงเป็นfoo'bar
'foo'\''bar'
อย่างที่ฉันพูดไป สิ่งนี้เป็นสิ่งจำเป็นเนื่องจากแบ็กสแลชหนีเครื่องหมายอัญประกาศเดี่ยวด้านนอกของสตริงที่ยกมาเดี่ยวเครื่องหมายแบ็กสแลชไม่มีอะไรในสตริงที่ยกมาเดี่ยวในทุบตีและสตริงที่ยกมาเดี่ยวสามารถปิดและเปิดใหม่โดยคำพูดเดียวหลายตราบใดที่ไม่มี การแทรกตัวอักขระที่มีความหมายพิเศษ ดังนั้น'\''
ปิดข้อความของสตริงแล้วส่งตัวอักษรที่หนีแล้วเปิดข้อความของสตริงอีกครั้ง