따옴표가 없는 파일에서 어떤 문자를 이스케이프해야 합니까?

따옴표가 없는 파일에서 어떤 문자를 이스케이프해야 합니까?

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 사용자가 대체 기록 확장 문자를 구성하지 않은 경우. 일부 쉘에서는 이를 허용합니다. 이것이 백슬래시 대신 작은따옴표를 사용하는 또 다른 이유입니다.

관련 정보