다음 명령을 실행할 때 Fedora 31과 Debian 10은 다르게 동작합니다:
/bin/ls /bin/!(znew) | /bin/grep znew
Fedora는 아무것도 인쇄하지 않지만 Debian은 다음을 인쇄합니다.
znew
znew
Fedora에 존재합니다. 실행하면 다음 /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 이 포함되어 있으면 해당 이름이 일치되어 출력됩니다./bin
znew
ls
-d
ls
znew
grep
알 수 없는 하위 디렉터리의 내용은 이름 앞에 디렉터리 경로가 추가되지 않은 채 /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
(현재 디렉토리)에 대한 심볼릭 링크라는 것이 발견되었습니다. .
이는 znew
pathname 을 통해 액세스할 수 있음을 의미합니다 /bin/X11/znew
.
그래서 요약하면, /bin/!(znew)
와일드카드 패턴이 경로 이름 목록으로 확장되는데 그 중 하나는 입니다 /bin/X11
(그러나 는 아님 /bin/znew
). 그러면 유틸리티 는 매개변수를 ls
포함하여 모든 경로 이름을 가져옵니다 . 목록을 /bin/X11
얻으면 ls
디렉토리의 내용이 그곳을 가리키므로 나열됩니다 /bin/X11
. 그러면 유틸리티가 이를 선택하여 출력의 일부가 됩니다./bin
/bin/X11
grep
znew
ls
주연 스티븐 차제라스댓글로 지적해/bin
, 이름에 개행 문자와 문자열(아마도 다른 개행 문자 및 기타 문자가 뒤따를 수 있음)이 포함된 파일이 데비안 시스템에 있는 경우 znew
동일한 효과를 얻게 됩니다 .
이름은 정확히 string 이 아니기 때문에 znew
패턴과 일치 /bin/!(znew)
하고 ls
해당 단일 이름을 다음과 같이 출력합니다.
/bin/something
znew
maybe more
해당 출력에서 추출됩니다 grep
.znew