echo !()가 현재 디렉토리의 내용을 인쇄하는 이유는 무엇입니까?

echo !()가 현재 디렉토리의 내용을 인쇄하는 이유는 무엇입니까?

나는 다양한 bash "예약어"의 의미를 스스로 가르쳐 왔습니다.

이 작업을 수행하는 동안 실수로 명령을 입력했습니다.

echo !()

놀랍게도 이 명령은 명령과 동일한 출력을 실행하고 생성합니다.

echo *

즉, 출력은 현재 디렉터리의 내용 목록입니다.

file1 file2 directory1 directory2

!()bash가 본질적으로 로 확장되는 이유는 무엇입니까 *?

()다른 문맥에서는 잘못된 표현인 것 같아 의미를 판단할 수 없습니다 .

답변1

이건 배쉬야extglob 패턴 매칭Korn 쉘(그 하위 집합)에서 구문을 복사합니다. !(pattern), extglob어떤 방식으로든 활성화되면(예: bash_completion대화형 셸의 추가 기능을 통해) 현재 작업 디렉터리에서 일치하지 않는(기본적으로 숨겨지지 않은) 파일의 이름으로 확장됩니다 pattern.

빈 패턴을 사용하는 경우 이름이 현재 디렉터리에 있는 모든 파일을 의미합니다.아니요빈 문자열이지만 파일 이름은 비워 둘 수 없으므로 이것이 모두(기본적으로 숨겨지지 않은) 파일입니다.

옵션이 활성화되면 zshksh와 동일한 결과를 얻게 됩니다.echo ^extendedglob^pattern!(pattern)

관련 정보