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

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

전반적인 상황오류가 인쇄되고 여기에 전달된 명령이 실행되지 않습니다.

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

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

*.c확장자가 비어 있으면 ls -l *.c디렉터리의 모든 파일이 표시되고 오류가 인쇄되지 않습니다.

failglobbash에는 원래 동작에 더 가까운 옵션이 있습니다 .

답변2

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

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

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

이유 bash가 기본적으로 빈 명령문을 반환하지 않는 이유는 어떤 경우에는 사용자가 "*"를 와일드카드로 사용하지 않기 때문에 "*" 확장이 필요하지 않기 때문입니다. 따라서 이 경우 "*"를 빈 문자열로 확장하면 오류가 됩니다. 그러나 이 기본 동작은 options 를 통해 재정의될 수 있습니다 nullglob.

관련 정보