누군가 이것이 어떻게 작동하는지 설명할 수 있습니까? 내장된 echo 명령이 디렉토리 목록과 상호 작용하는 방식을 이해하지 못합니다.
bash-5.2$ ls
2 file000 file003 file006 file009 file012 file015 file018 file021 file024 file027 h
5 file001 file004 file007 file010 file013 file016 file019 file022 file025 file028 ola
8 file002 file005 file008 file011 file014 file017 file020 file023 file026 file029 q
bash-5.2$ echo [0-9a-z]
2 5 8 h q
감사해요.
답변1
이는 수신된 인수, 공백 분리 및 개행 종료(일부 잠재적인 옵션 처리 및 백슬래시 이스케이프 처리 후)를 인쇄하는 것과는 아무런 관련이 없습니다 echo
.echo
여기서 보이는 것은 쉘의 효과입니다.와일드카드, 또한 ~으로 알려진파일 이름 생성또한 ~으로 알려진경로명 확장*
, 따라서 목록 컨텍스트에서 , ?
및 ( 제외 fish
) , [...]
(셸에 따라 더 많은 경우도 가능)를 포함하여 인용되지 않은 와일드카드 패턴 연산자가 포함된 경우 일부 단어가 확장됩니다.쉘을 통해디렉토리 트리에서 일치하는 파일 목록으로 이동합니다.
명령에 관계없이 echo
, rm
, firefox
...
다음에서 본 적이 있을 것입니다.
rm -- *.txt
거기에서 *
행동이 유발됩니다.
존재하다:
echo [0-9a-z]
그것이 [...]
그것을 촉발시킨 것입니다. 패턴으로 는 및 또는 1과 사이의 문자 하나와 일치하므로 [0-9a-z]
와일드카드로 이 단어는 패턴과 일치하는 현재 작업 디렉터리의 모든 단일 문자 파일 이름으로 확장됩니다.0
9
a
z
[0-9a-z]
rm -- [0-9a-z]
삭제, vi -- [0-9a-z]
편집 등을 할 것입니다 .
중요한 팁:명령, rm
, echo
, vi
... 중 하나는 패턴이 아닌 확장 결과(별도의 인수로)만 표시합니다. 특히 해당 확장자의 첫 번째² 파일 이름이 -
3로 시작하는 경우 잠재적으로 재앙적인 영향을 미치는 옵션으로 간주될 수 있으므로 에서와 마찬가지로 ⁴을 cmd -- $files
잊지 않는 것이 중요합니다 --
.
2
¹ 여기에는 , 5
, , 8
와 같은 문자가 포함되지만 h
, , 와 같은 자주 q
(종종 간과되는) 문자도 포함됩니다 ²
.DŽ