bash 명령을 실행하는 브라우저 기반 쉘 / 터미널이 있으며 공백을 피하고 있지만 괄호도 이스케이프해야한다는 것이 밝혀졌습니다. 따옴표가 아닌 파일 이름의 경우 다른 문자를 이스케이프해야합니까?
mv filename filename-foo
bash에 명령 이 있는데 공백과 괄호 외에 어떤 문자를 이스케이프해야합니까?
mv "$filename" "$newname"
.
bash 명령을 실행하는 브라우저 기반 쉘 / 터미널이 있으며 공백을 피하고 있지만 괄호도 이스케이프해야한다는 것이 밝혀졌습니다. 따옴표가 아닌 파일 이름의 경우 다른 문자를 이스케이프해야합니까?
mv filename filename-foo
bash에 명령 이 있는데 공백과 괄호 외에 어떤 문자를 이스케이프해야합니까?
mv "$filename" "$newname"
.
답변:
간단한 해결책은 '
시작 부분에 작은 따옴표 ( ) 를 넣고 끝에 작은 따옴표를 '
넣고 파일 이름의 모든 문자를 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
일부 쉘에서 백 슬래시로 인용 할 수 있습니다.