이 와일드카드를 처리하는 것은 ls 명령이 아니라 전적으로 셸의 몫이다. 셸은 표현식 *.py를 평가해 ls 명령을 실행하기에 앞서, 우리 눈에 보이지 않게 이 표현식과 일치하는 파일명의 목록을 만들어둔다. 따라서 ls 명령은 와일드카드를 직접 접하지 않는다. ls 명령의 입장에서는 다음과 같은 명령을 입력받은 셈이 된다.
$ ls data.py main.py user_interface.py
셸은 1장에서 배운 파이프라인을 처리하는 역할도 담당한다. 셸이 표준 입력과 표준 출력을 투명하게 서로 연결하므로, 이들 스트림을 사용하는 프로그램은 스트림이 무엇과 연결돼 있는지 알지 못한다.
명령이 실행되는 과정 중 일부는 실행된 프로그램(여기서는 ls)이 담당하지만, 셸이 담당하는 부분도 있다. 고급 리눅스 사용자는 이러한 경계를 잘 이해한다. 이러한 이해 덕분에 복잡하고 긴 명령어를 머릿속에서 떠올리고 제대로 실행할 수 있다. 명령 실행 과정을 프로그램과 셸이 어떻게 분담하는지 알고 있으므로, Enter 키를 눌러 명령을 실행하기 전에 이 명령이 실행되는 과정을 이미 이해하고 있는 것이다.