명령 행 인수는 시스템의 명령 쉘에 의해 해석되어 명령의 동작을 변경하거나 인수가 호출 된 프로그램에 전달되기 전에 인수의 값을 변경합니다.
인수 (예 :에 대한 값 --password
)에 쉘이 해석 할 수있는 문자가 포함 된 경우, 인용 부호 (일반적으로 '
유닉스 에서는 작은 따옴표로 묶 거나 "
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
작은 따옴표와 다른 특수 문자가있는 경우 유닉스에서는 큰 따옴표가 작은 따옴표보다 "약한"이며 큰 따옴표로 묶었을 때 많은 메타 문자가 확장되지만 작은 따옴표는 아니기 때문에 백 슬래시 이스케이프가 발생합니다. 인용 부호.
이것은 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의 작은 따옴표로 묶은 문자열 내부에서 아무것도 이스케이프하지 않으며, 이스케이프 처리되지 않은 한 작은 따옴표로 묶은 작은 따옴표로 문자열을 닫고 다시 열 수 있기 때문에 필요합니다. 특별한 의미가있는 중간 문자. 따라서 '\''
문자열의 인용을 닫고 이스케이프 된 리터럴을 제공 한 다음 문자열의 인용을 다시 엽니 다.