내 제한된 연구에 따르면 bash에서는 전역 패턴 뒤의 여러 슬래시가 다음과 같이 잘립니다.
echo ////[h]ome////user////Desktop////test////
# outputs ////home/user/Desktop/test/
echo ////home////user////Desktop////tes[t]////
# outputs ////home////user////Desktop////test/
이 결론이 맞나요?이 동작이 정의되어 있나요?그렇다면 어디에서? 다른 쉘간에 공유됩니까? 상관관계가 있나요?
bash 매뉴얼을 읽었지만 이에 대해 아무것도 찾을 수 없습니다. 비록 뭔가 빠졌을 수도 있습니다. 나는 이 기호들 사이에 의미론적 차이가 없다는 것을 알고 있습니다(앞에 이중 슬래시를 제외하고). 이 동작이 의도적인 것인지 목적이 있는 것인지는 알 수 없습니다.
편집: 설명된 동작은 Ubuntu의 기본 bash에서 발생합니다. Korn 쉘( /usr/bin/sh
)은 슬래시를 자르지 않습니다.
편집 2: 명확히 하기 위해:
- Linux가 다중 슬래시를 처리하는 방법을 묻는 것이 아닙니다. 분명히 이중 슬래시 예외를 제외한 다중 슬래시는 의미론적 의미가 없으며 잘릴 수 있습니다.
- 나는 이 동작이 쉘 파이프라인의 어떤 것에 어떤 영향을 미치는지 묻지 않습니다. 물론 전역 확장이 인수로 전달되는 경우 슬래시가 더 많다는 점을 제외하면 그렇지 않습니다.
- 나는 glob 패턴이 있는 경로에서 왜 이런 일이 발생하는지 묻지 않습니다. 분명히 glob 확장을 처리하는 코드는 무엇이든 glob 뒤에 오는 슬래시도 잘립니다.
- 구체적으로 묻습니다이 동작이 정의되어 있는지 여부, 의도적으로 또는 의도적으로 다른 쉘간에 공유됩니다.
답변1
몇 가지 조사 결과:
동작(추가 슬래시 제거)은 다음과 같습니다.분명히허용하다POSIX를 통해.
경로 이름의 문자는 다음을 사용하여 명시적으로 일치해야 합니다.하나 이상 패턴의 문자
나는 우리가 이 텍스트에서 그것이 무엇인지 추론할 수 없다고 생각한다.필수의.
이 작업을 수행할 수 있는 유일한 다른 쉘은
fish
다음과 같습니다.$ fish -c 'echo //hom?///stephane///.' /home/stephane/.
csh
,,,,,,,,,,,,,, 이러지 마세요.tcsh
dash
ksh93
mksh
yash
zsh
bosh
rc
es
akanga
구현 을 테스트하지 않았습니다
glob()
.bash 1.13.1(실행할 수 있는 가장 초기 버전)은 이미 다음과 같이 작동합니다.
ksh는 sh에 대한 POSIX 사양의 기초가 되는 셸이며, 셸 bash는 대부분의 기능을 복제하지만 동작은 그렇지 않습니다.
Bash 참조 매뉴얼에는 다음과 같은 내용이 나와 있습니다.파일 이름을 일치시킬 때 슬래시 문자는 항상 패턴의 명시적 슬래시와 일치해야 하지만 다른 일치 컨텍스트에서는 아래 설명된 대로 특수 패턴 문자와 일치할 수 있습니다., 이는 중복된 을 삭제하는 것을 정당화하지 않습니다
/
.
이 모든 것은 이것이 의도하지 않은 구현 사고였을 수 있음을 시사합니다. POSIX에서는 필요하지 않습니다. 내가 아는 한, 다른 Bourne/POSIX 계열 쉘은 이를 수행할 수 없습니다. IMO, 생성된 파일 이름이 패턴과 일치하지 않을 수 있으므로 이는 권장되지 않습니다( case
예: 구성 중).
이는 해당 동작에 의존할 수 없거나 스크립트에서 해당 동작을 사용할 수 없음을 의미합니다 sh
. 스크립트에서 이에 의존하면 bash
향후 상황을 수용하지 못할 수도 있습니다.
¹ glob이 의 패턴과 일치하지 않는 경로 이름을 생성할 수 있는 다른 이유가 있지만 foo[a/b]bar*
.