extglob은 Fedora와 Debian bash에서 다르게 동작합니다.

extglob은 Fedora와 Debian bash에서 다르게 동작합니다.

다음 명령을 실행할 때 Fedora 31과 Debian 10은 다르게 동작합니다:

/bin/ls /bin/!(znew) | /bin/grep znew

Fedora는 아무것도 인쇄하지 않지만 Debian은 다음을 인쇄합니다.

znew

znewFedora에 존재합니다. 실행하면 다음 /bin/ls /bin/znew | /bin/grep znew을 얻습니다.

/bin/znew

(데비안에서도 같은 일이 발생합니다)

두 배포판 모두에서 bash 구성을 확인했는데 내가 찾은 유일한 차이점은 Fedora에서 다음과 같다는 것입니다.

cdable_vars     on
cdspell         on
dirspell        on
login_shell     on

Debian에서는 이러한 옵션이 비활성화되어 있습니다.extglob두 배포판 모두에서 활성화됨

참고: 명령은 grep목록을 더 짧게 만들기 위해 여기서만 사용됩니다.

버전:

  • Fedora: 5.0.11

  • 데비안: 5.0-4

왜 그런 차이가 있습니까?

업데이트 1

/bin은 Debian과 Fedora의 /usr/bin에 대한 심볼릭 링크입니다.

다음은 파일 이름에서 znew 문자열을 검색한 결과입니다.

updatedb && locate  znew
/usr/bin/znew
/usr/share/man/man1/znew.1.gz
/var/lib/flatpak/runtime/org.freedesktop.Platform/x86_64/19.08/5a35247ad1c941455f2f9c4139d9136c6c0662e1b04e5b3c56121e7f67ba0100/files/bin/znew
/var/lib/lxc/centos/rootfs/usr/bin/znew
/var/lib/lxc/centos/rootfs/usr/share/man/man1/znew.1.gz
/var/lib/lxc/opensuse/rootfs/usr/bin/xznew
/var/lib/lxc/opensuse/rootfs/usr/bin/znew
/var/lib/lxc/opensuse/rootfs/usr/share/man/man1/xznew.1.gz
/var/lib/lxc/opensuse/rootfs/usr/share/man/man1/znew.1.gz

업데이트 2

내가 발견한 흥미로운 점은 Debian에 /bin/X11에 대한 심볼릭 링크가 있으며 .제거하면 Fedora에서와 동일하게 작동한다는 것입니다.

답변1

셸 옵션이 extglob대화형 세션에서 설정되어 있다고 가정하면 다음 명령은bash

ls /bin/!(znew) | grep znew

First는 인수가 아닌 ls모든 이름을 사용하여 실행됩니다 . 이 이름 목록에 하위 디렉토리의 이름이 포함되어 있으면 해당 하위 디렉토리의 내용이 출력됩니다( 와 함께 사용되지 않기 때문 ). 이러한 하위 디렉터리 중 하나에 name 이 포함되어 있으면 해당 이름이 일치되어 출력됩니다./binznewls-dlsznewgrep

알 수 없는 하위 디렉터리의 내용은 이름 앞에 디렉터리 경로가 추가되지 않은 채 /bin나열됩니다 . ls따라서 하위 디렉터리에 name 이 포함되어 있으면 as 대신 as 로 znew출력됩니다 .znew/bin/some-dir/znew

ls예를 들어 언제 사용합니까?

ls /bin/znew | grep znew

/bin/znew대신 문자열을 출력합니다 znew(경로명이 존재하는 경우). 이는 인수로 제공된 디렉터리의 내용이 아닌 명령줄 인수로 제공된 파일의 특정 경로 이름을 출력하기 때문입니다.

/usr/bin호출된 항목 이 이미 심볼릭 링크인 /bin동안 누군가가 심볼릭 링크를 만들려고 시도하거나 해당 항목이 여전히 디렉터리인 경우 유사한 상황이 발생할 수 있습니다 ./bin/usr/bin/bin

질문에 대한 업데이트에서 이것이 /bin/X11(현재 디렉토리)에 대한 심볼릭 링크라는 것이 발견되었습니다. .이는 znewpathname 을 통해 액세스할 수 있음을 의미합니다 /bin/X11/znew.

그래서 요약하면, /bin/!(znew)와일드카드 패턴이 경로 이름 목록으로 확장되는데 그 중 하나는 입니다 /bin/X11(그러나 는 아님 /bin/znew). 그러면 유틸리티 는 매개변수를 ls포함하여 모든 경로 이름을 가져옵니다 . 목록을 /bin/X11얻으면 ls디렉토리의 내용이 그곳을 가리키므로 나열됩니다 /bin/X11. 그러면 유틸리티가 이를 선택하여 출력의 일부가 됩니다./bin/bin/X11grepznewls


주연 스티븐 차제라스댓글로 지적해/bin, 이름에 개행 문자와 문자열(아마도 다른 개행 문자 및 기타 문자가 뒤따를 수 있음)이 포함된 파일이 데비안 시스템에 있는 경우 znew동일한 효과를 얻게 됩니다 .

이름은 정확히 string 이 아니기 때문에 znew패턴과 일치 /bin/!(znew)하고 ls해당 단일 이름을 다음과 같이 출력합니다.

/bin/something
znew
maybe more

해당 출력에서 ​​추출됩니다 grep.znew

관련 정보