리눅스 시스템에서 사용할 수 있는 실행 파일들의 목록을 출력해보는 예제 스크립트입니다.
커맨드라인에서 프로그램을 실행하면 리눅스 시스템은 실행 파일을 찾기 위해 $PATH
환경 변수에 정의 된 경로를 탐색합니다.
$ echo $PATH
/home/hyeob/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
내용을 보면, :
을 통해 각 경로들이 구분되어 있는 것을 볼 수 있습니다.
한 예로 첫 번째 경로의 파일 내용을 살펴보겠습니다.
$ cd /home/hyeob/.local/bin
$ ll
total 104
drwxrwxr-x 2 hyeob hyeob 4096 Mar 27 04:41 ./
drwx------ 5 hyeob hyeob 4096 Mar 25 05:00 ../
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-config*
-rwxrwxr-x 1 hyeob hyeob 13397 Mar 21 08:45 ansible-connection*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-console*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-doc*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-galaxy*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-inventory*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-playbook*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-pull*
-rwxrwxr-x 1 hyeob hyeob 1474 Mar 21 08:45 ansible-test*
-rwxrwxr-x 1 hyeob hyeob 5915 Mar 21 08:45 ansible-vault*
-rwxrwxr-x 1 hyeob hyeob 210 Mar 27 04:41 netaddr*
실행 파일들이 엄청 많이 보입니다.
그렇다면 이제부터 시스템 내에 존재하는 모든 실행 파일에 대해 출력해보는 스크립트를 작성해보겠습니다.
$ cat test1
#!/bin/bash
IFS=:
for folder in $PATH
do
for file in $folder/*
do
if [ -x $file ]
then
echo "$file"
fi
done
done
$ ./test1
/home/hyeob/.local/bin/ansible
/home/hyeob/.local/bin/ansible-config
/home/hyeob/.local/bin/ansible-connection
/home/hyeob/.local/bin/ansible-console
/home/hyeob/.local/bin/ansible-doc
/home/hyeob/.local/bin/ansible-galaxy
/home/hyeob/.local/bin/ansible-inventory
/home/hyeob/.local/bin/ansible-playbook
/home/hyeob/.local/bin/ansible-pull
/home/hyeob/.local/bin/ansible-test
/home/hyeob/.local/bin/ansible-vault
/home/hyeob/.local/bin/netaddr
/usr/local/bin/aws
/usr/local/bin/aws_completer
/usr/local/bin/docker-compose
내부 필드 구분자
인 IFS
를 :
으로 설정해주어 스크립트를 실행할 때는 :
을 기준으로 필드를 구분하도록 했습니다.$PATH
환경 변수의 경로들을 :
를 기준으로 구분해서 하나씩 참조합니다(첫 번째 for
).for
).$file
변수가 실행 파일(-x
)이라면 해당 파일명을 출력합니다(if
).