Bash: 일치하지 않는 경우 * 빈 문자열을 반환하지 않는 이유는 무엇입니까?

Bash: 일치하지 않는 경우 * 빈 문자열을 반환하지 않는 이유는 무엇입니까?

일치하는 항목이 없을 때 *가 자체적으로 반환되는 이유를 이해할 수 없습니다. 이것답변이것이 사실이라고 말하지만 나는 이 행동에 대한 근거를 이해하지 못합니다. * 또는 일반 패턴이 일치하지 않는 경우 왜 빈 문자열을 반환하지 않습니까?

$ls      # Look, no files
$touch a # Add a file
$echo *  # Works as expected
a
$rm a    # Remove the file
$echo *  # Will output a '*'. Why not ''?
*
$*       # Ok, * will fail, but how come the previous output?
-bash: *: command not found
$

답변1

어떤 파일과도 일치하지 않는 패턴은 오류로 간주됩니다. 이것은 유닉스의 첫 번째 버전에서 볼 수 있습니다.

글로브오류가 인쇄되고 전달된 명령은 실행되지 않습니다.

오류 메시지는 다음과 같습니다."일치하지 않음".

다음에서 파생된 현대 쉘에서본(유닉스 버전 7)ls -l *.c, "*.c: 해당 파일 또는 디렉터리가 없습니다."라는 오류가 생성됩니다 . 이 메시지가 이해하기 더 쉽다고 말하고 싶습니다. 또한 실패한 패턴을 나타냅니다.

*.c빈 상태로 확장된 경우 ls -l *.c대신 디렉터리의 모든 파일이 표시되고 오류가 인쇄되지 않습니다.

failglobbash에는 원본에 더 가까운 동작을 위한 옵션이 있습니다 .

답변2

*는 실제로 bash(쉘이 무엇이든)에 의해 확장되고 다음으로 전달됩니다.에코. 그만큼에코명령은 아무것도 하지 않고 표준 출력으로 인쇄합니다. 이 문서를 읽어보세요 -파일 이름 확장. 그것은 말한다-

Bash는 각 단어에서 "*", "?", "[" 문자를 검색합니다. 이러한 문자 중 하나가 나타나면 해당 단어는 패턴으로 간주되고 패턴과 일치하는 알파벳순으로 정렬된 파일 이름 목록으로 대체됩니다. 일치하는 파일 이름이 없고 쉘 옵션 nullglob이 비활성화된 경우 단어는 변경되지 않고 그대로 유지됩니다. nullglob 옵션이 설정되어 있고 일치하는 항목이 없으면 해당 단어가 제거됩니다.

따라서 실제로 bash가 일치하는 항목을 찾을 수 없으면 '*'를 변경하지 않고 그대로 두고 echo는 이를 인쇄합니다.

이유 bash가 기본적으로 빈 명령문을 반환하지 않는 이유는 사용자가 '*'를 와일드카드로 사용하기를 원하지 않아 '*' 확장이 필요하지 않은 경우가 있기 때문입니다. 따라서 이 경우 '*'를 빈 문자열로 확장하면 오류가 발생합니다. 그러나 이 기본 동작은 옵션으로 재정의될 수 있습니다 nullglob.

관련 정보