bash의 *는 어떻게 프로그램에 전달됩니까?

bash의 *는 어떻게 프로그램에 전달됩니까?

evince *PDF가 많은 폴더에 입력하면 evince로 무엇이 전송되나요? evince는 X 인수를 받나요, 아니면 X번의 evince가 열려 각각 하나의 인수(단일 파일)를 받나요?

답변1

Bash는 각 명령줄에서 셸 확장을 수행합니다. 그 확장 중 하나는파일 이름 확장*에 따라 대체됩니다 .패턴 매칭규칙.

의 경우 를 현재 작업 디렉터리의 내용으로 evince *바꿉니다 . *내용은 일반 파일, 하위 디렉터리, 링크 등의 이름을 의미합니다. 도트 파일은 제외됩니다. 기본적으로 달리기를 통해 얻는 것 ls. 귀하의 경우에는 PDF의 파일 이름입니다.

따라서 evince바이너리는 현재 작업 디렉터리에 포함된 알파벳순으로 정렬된 파일 이름을 인수로 사용하여 Bash에 의해 한 번만 실행됩니다. Evince가 이후 출시를 처리하는 방식은 Evince나 그것이 의존하는 프레임워크나 라이브러리에 따라 다르지만 barebones X는 여기서 특별한 작업을 수행하지 않습니다. Evince나 X는 그것이 *. 예를 들어:

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

*어떻게 확장되는지 알고 싶다면 를 실행하세요 echo *. 작업 디렉터리가 비어 있으면(점 파일만 포함) 별표가 확장되지 않고 명령 실행을 위한 인수로 유지된다는 점을 알 수 있습니다.

링크된 Bash 매뉴얼에서 언급했듯이 이 동작을 변경하는 설정이 많이 있습니다. 다른 껍질은 말할 것도 없습니다.

관련 정보