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


12

bash 명령을 실행하는 브라우저 기반 쉘 / 터미널이 있으며 공백을 피하고 있지만 괄호도 이스케이프해야한다는 것이 밝혀졌습니다. 따옴표가 아닌 파일 이름의 경우 다른 문자를 이스케이프해야합니까?


당신이하려는 일이 전혀 명확하지 않습니다. 자동 완성은 무엇과 관련이 있습니까?
마이클 Vehrs

@MichaelVehrs mv filename filename-foobash에 명령 이 있는데 공백과 괄호 외에 어떤 문자를 이스케이프해야합니까?
jcubic

@MichaelVehrs가 자동 완성 언급을 제거했습니다.
jcubic

기본적으로 공백, 쉘 글로브, 히스토리 이벤트와 같은 모든 쉘 메타 문자. 따라서 개별 문자를 이스케이프하지 않고 전체 파일 이름을 인용해야합니다 mv "$filename" "$newname".
Michael Vehrs

@MichaelVehrs 인용하면 이스케이프 문제를 해결할 수 있지만 따옴표없이 파일 이름을 사용해야합니다. 터미널 에뮬레이터가 있으며 사용자가 따옴표를 사용하지 않으면 작동해야합니다.
jcubic

답변:


22

간단한 해결책은 '시작 부분에 작은 따옴표 ( ) 를 넣고 끝에 작은 따옴표를 '넣고 파일 이름의 모든 문자를 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 문자는 항상 ok¹입니다. 확실하지 않은 경우 공백과 문장 부호를 인용하십시오.

일반적인 쉘 (ksh, bash 또는 zsh)을 사용하면 최소한 일부 상황에서 다음 문자를 인용해야합니다.

  • 공백 (공백, 탭, 줄 바꿈-줄 바꿈은 백 슬래시로 인용 할 수 없음을 기억)
  • ! — 역사 확장.
  • " — 쉘 구문.
  • #— 앞에 공백이 있으면 주석이 시작됩니다. zsh 와일드 카드.
  • $ — 쉘 구문.
  • & — 쉘 구문.
  • ' — 쉘 구문.
  • (— 단어 중간에도 : ksh 확장 글롭 (bash 및 zsh로도 사용 가능); zsh 와일드 카드.
  • )(참조 ()
  • * — sh 와일드 카드.
  • , — 내부 괄호 확장 만.
  • ; — 쉘 구문.
  • < — 쉘 구문.
  • = — zsh에서 파일 이름이 시작될 때 (PATH 조회를 통한 파일 이름 확장)
  • > — 쉘 구문.
  • ? — sh 와일드 카드.
  • [ — sh 와일드 카드.
  • \ — 쉘 구문.
  • ] — 인용 부호없이 그대로 둘 수 있습니다.
  • ^— 역사 확장; zsh 와일드 카드.
  • ` — 쉘 구문.
  • { — 버팀대 확장.
  • | — 쉘 구문.
  • } — zsh에서 이스케이프 처리해야합니다. 여는 중괄호가 없으면 다른 쉘이 더 관대합니다.
  • ~— 파일 이름의 시작 부분에있을 때 홈 디렉토리 확장; zsh 와일드 카드; 마지막 문자 일 때는 항상 안전합니다.

몇 가지 추가 문자는 때때로 특수 처리가 필요할 수 있습니다.

  • -쉘에는 특별하지 않지만 명령 인수의 시작 부분에있을 때 옵션을 나타냅니다. 특수 처리는 쉘이 아닌 명령에 있기 때문에 따옴표로 보호 할 수 없습니다. 로 시작하는 파일 이름을 보호하기 위해 파일 이름 앞에 -넣을 수 있습니다. ./이렇게하면 여전히 같은 파일이지만 인수는 -더 이상 시작되지 않습니다 .
  • .그 자체로는 특별하지 않지만 도트 파일은 *기본적으로 글로브 에서 제외됩니다 .
  • :쉘에서는 특별하지 않지만 일부 명령은 원격 파일 ( hostname:filename) 을 표시하기 위해 특별히 구문 분석합니다 . 콜론을 포함하는 파일 이름을 처리하는 방법을 보려면 명령 문서를 참조하십시오.

¹ 사용자가 대체 기록 확장 문자를 구성하지 않은 경우 일부 포탄은 이것을 허용합니다. 백 슬래시 대신 작은 따옴표를 사용해야하는 또 다른 이유입니다.


개행은 적어도 LF일부 쉘에서 백 슬래시로 인용 할 수 있습니다.
iBug

@iBug 아니오. sh와 같은 쉘에서 backslash + newline은 개행 문자가 아닌 빈 문자열로 확장됩니다.
Gilles 'SO- 악한 중지'

좋은 답변입니다. 감사합니다. 이 정보를 '공식적으로'이용할 수있는 링크가 있습니까?
slashmais

1
@slashmais 어떤 정보? 쉘 언어의 구문은 다양한 매뉴얼과 사양에서 "공식적으로"사용할 수 있지만, 거기에서 완전히 간단하지 않은 곳에 어떤 문자를 인용해야 하는지를 정확히 찾아냅니다.
Gilles 'SO- 악마 그만해'

1
나는 또한 이것을 발견했다 : tecmint.com/manage-linux-filenames-with-special-characters- 당신의 목록만큼 작지 는 않지만 많은 예제가 있습니다. (by-by-by : 여기서 "주제에
관해 이야기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.