Bash 명령을 실행하기 위한 브라우저 기반 셸/터미널이 있고 공백을 이스케이프 처리하고 있었지만 대괄호도 이스케이프해야 하는 것으로 나타났습니다. 따옴표로 묶이지 않은 파일 이름에 대해 이스케이프해야 하는 다른 문자는 무엇입니까?
답변1
간단한 해결책은 시작 부분에 작은따옴표( '
)를 넣고 끝에 또 다른 작은따옴표를 넣은 다음 '
파일 이름의 각 문자를 4개의 문자 시퀀스로 바꾸는 것입니다 '\''
. '
문자열의 끝을 표시하는 문자 자체를 제외하고 모든 문자는 작은따옴표로 묶인 문자열 내에서 특별한 의미를 잃습니다 . 이 시퀀스는 '\''
작은 따옴표 리터럴을 끝내고, 그 뒤에 따옴표로 묶인 작은 따옴표 리터럴이 오고, 새 작은 따옴표 리터럴을 엽니다. 그래서 파일 이름은
This file's name has some weird characters!
Will you manage to escape them?
다음과 같이 인용할 수 있습니다.
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
큰따옴표에는 더 복잡한 이스케이프 규칙이 있으며 히스토리 대체가 활성화되면 느낌표가 허용되지 않으므로 !
더 이상 고려하지 않겠습니다.
또 다른 방법은 백슬래시로 문자를 보호하는 것입니다. 이는 개행 문자를 제외한 모든 문자에 적용됩니다. 개행 문자의 경우 작은따옴표(또는 큰따옴표) 안에 넣는 것이 유일한 해결책입니다. 사용자에게 인용된 이름을 표시하는 데 사용되는 백슬래시 수를 최소화하려면 백슬래시가 필요한 위치로 제한할 수 있습니다. 그러나 생략하는 백슬래시가 많을수록 필수 백슬래시를 잊어버릴 위험이 커집니다. 더 크다. 문자, 숫자, ASCII가 아닌 문자는 항상 허용됩니다. 확실하지 않을 때는 공백과 구두점을 인용하세요.
일반적인 셸(ksh, bash 또는 zsh)의 경우 최소한 일부 경우에는 다음 문자를 인용해야 합니다.
- 공백(공백, 탭, 줄바꿈 - 줄바꿈은 백슬래시로 인용할 수 없다는 점을 기억하세요).
!
——역사적 확장."
— 쉘 구문.#
— 앞에 공백 문자가 있으면 주석이 시작됩니다.$
— 쉘 구문.&
— 쉘 구문.'
— 쉘 구문.(
— 단어 중간에도: ksh 확장 glob(bash 및 zsh에서도 사용됨);)
(바라보다(
)*
— sh 와일드카드.,
— 중괄호 내에서만 확장됩니다.;
— 쉘 구문.<
— 쉘 구문.=
- 할당처럼 보이는 경우 명령 이름(인수 아님)에. 또한 zsh에서는 파일 이름의 시작 부분에 있을 때(PATH 조회를 통한 파일 이름 확장).>
— 쉘 구문.?
— sh 와일드카드.[
— sh 와일드카드.\
— 쉘 구문.]
- 따옴표를 추가하지 않고도 문제를 해결할 수 있습니다.^
——역사 확장. zsh 와일드카드.`
— 쉘 구문.{
— 확장을 지원합니다.|
— 쉘 구문.}
— zsh에서 이스케이프해야 하며, 일치하는 여는 중괄호가 없으면 다른 쉘이 더 관대합니다.~
— 홈 디렉토리가 파일 이름의 시작 부분에 있는 경우 확장, zsh 와일드카드는 마지막 문자인 경우 항상 안전합니다.
때로는 더 많은 문자에 특별한 처리가 필요할 수 있습니다.
-
쉘에 특별한 것은 아니지만 명령 인수의 시작 부분에 있으면 옵션을 나타냅니다. 특별한 처리는 쉘이 아닌 명령에 있기 때문에 인용할 수 없습니다. 로 시작하는 파일 이름을 보호하려면 ---
을 추가하면./
파일 이름은 여전히 동일하지만 매개변수는 더 이상 으로 시작하지 않습니다-
..
그 자체로는 특별한 것은 아니지만*
도트 파일은 기본적으로 glob에서 제외됩니다.:
셸에서는 특별하지 않지만 일부 명령은 원격 파일(hostname:filename
)을 나타내는 등 특별히 구문 분석합니다. 콜론이 포함된 파일 이름을 처리하는 방법을 알아보려면 이 명령에 대한 설명서를 참조하세요.
1 사용자가 대체 기록 확장 문자를 구성하지 않은 경우. 일부 쉘에서는 이를 허용합니다. 이것이 백슬래시 대신 작은따옴표를 사용하는 또 다른 이유입니다.